Browse Source

feat(electron): 添加图片压缩功能

- 引入 sharp 库用于处理图像
- 实现 readFileImageForPath 函数,添加图片压缩逻辑
- 增加 async/await 和错误处理,提高代码健壮性
panqiuyao 5 months ago
parent
commit
a1266e98bc
2 changed files with 25 additions and 10 deletions
  1. 24 10
      electron/controller/utils.js
  2. 1 0
      package.json

+ 24 - 10
electron/controller/utils.js

@@ -12,6 +12,7 @@ const errData = {
   msg :'请求失败,请联系管理员',
   code:999
 }
+const sharp = require('sharp'); // 确保安装:npm install sharp
 
 
 /**
@@ -155,7 +156,7 @@ class UtilsController extends Controller {
 
   }
 
-  readFileImageForPath(filePath){
+  async readFileImageForPath(filePath,maxWidth=1500){
 
     const getMimeType = (fileName)=>{
       const extension = path.extname(fileName).toLowerCase().replace('.', '');
@@ -184,19 +185,32 @@ class UtilsController extends Controller {
       return mimeType;
     }
 
-    const fileBuffer = fs.readFileSync(filePath);
+    try {
+      const fileName = path.basename(filePath);
+      const image = sharp(filePath);
+      const metadata = await image.metadata();
 
+      let mimeType = getMimeType(fileName); // 调用下面定义的私有方法获取 MIME 类型
 
-    const fileName = path.basename(filePath);
-    const mimeType = getMimeType(fileName); // 自定义获取 MIME 类型的方法
-    return  {
-      fileBuffer:fileBuffer,
-      fileName:fileName,
-      mimeType:mimeType,
-    };
+      let fileBuffer;
 
+      if (metadata.width > maxWidth) {
+        // 如果宽度大于 1500px,压缩至 1500px 宽度,保持比例
+        fileBuffer = await image.resize(maxWidth).toBuffer();
+      } else {
+        // 否则直接读取原图
+        fileBuffer = fs.readFileSync(filePath);
+      }
 
-    return new File([fileBuffer], fileName, { type: mimeType });
+      return {
+        fileBuffer,
+        fileName,
+        mimeType
+      };
+    } catch (error) {
+      console.error('Error processing image:', error);
+      throw error;
+    }
 
 
   }

+ 1 - 0
package.json

@@ -63,6 +63,7 @@
     "electron-updater": "5.3.0",
     "lodash": "4.17.21",
     "node-window-manager": "2.2.4",
+    "sharp": "^0.34.2",
     "ws": "8.18.1"
   }
 }