Просмотр исходного кода

fix: 打包模式下 uploads 目录使用 userData 路径,避免 Program Files 权限问题

ethanfly 3 дней назад
Родитель
Сommit
00df6bb662
3 измененных файлов с 17 добавлено и 1 удалено
  1. 10 0
      client/electron/local-services.ts
  2. 2 0
      client/src/components.d.ts
  3. 5 1
      server/src/middleware/upload.ts

+ 10 - 0
client/electron/local-services.ts

@@ -210,6 +210,16 @@ function startNodeServer(): void {
     USE_REDIS_QUEUE: 'false',
   };
 
+  // 打包模式下,uploads 目录使用 userData(可写),避免 Program Files 权限问题
+  if (isPackaged()) {
+    const uploadsDir = path.join(app.getPath('userData'), 'uploads');
+    if (!fs.existsSync(uploadsDir)) {
+      try { fs.mkdirSync(uploadsDir, { recursive: true }); } catch { /* ignore */ }
+    }
+    env.UPLOAD_PATH = uploadsDir;
+    log('INFO', `UPLOAD_PATH: ${uploadsDir}`);
+  }
+
   if (useElectronAsNode) {
     env.ELECTRON_RUN_AS_NODE = '1';
     log('INFO', 'ELECTRON_RUN_AS_NODE=1');

+ 2 - 0
client/src/components.d.ts

@@ -18,6 +18,7 @@ declare module 'vue' {
     ElCascader: typeof import('element-plus/es')['ElCascader']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
     ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
+    ElCol: typeof import('element-plus/es')['ElCol']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
     ElContainer: typeof import('element-plus/es')['ElContainer']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
@@ -43,6 +44,7 @@ declare module 'vue' {
     ElProgress: typeof import('element-plus/es')['ElProgress']
     ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
     ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
+    ElRow: typeof import('element-plus/es')['ElRow']
     ElSelect: typeof import('element-plus/es')['ElSelect']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']

+ 5 - 1
server/src/middleware/upload.ts

@@ -11,7 +11,11 @@ const uploadDirs = ['videos', 'images', 'covers'];
 uploadDirs.forEach(dir => {
   const fullPath = path.join(config.upload.path, dir);
   if (!fs.existsSync(fullPath)) {
-    fs.mkdirSync(fullPath, { recursive: true });
+    try {
+      fs.mkdirSync(fullPath, { recursive: true });
+    } catch (err) {
+      console.error(`[upload] Failed to create upload dir ${fullPath}:`, err);
+    }
   }
 });