Ver código fonte

用户管理模块和项目简介

shaogen1995 11 horas atrás
pai
commit
999a8270c9
4 arquivos alterados com 42 adições e 39 exclusões
  1. 1 2
      src/app.ts
  2. 27 29
      src/controller/fileController.ts
  3. 13 8
      src/middleware/fileUpload.ts
  4. 1 0
      src/model/fileModel.ts

+ 1 - 2
src/app.ts

@@ -31,8 +31,7 @@ else {
   app.use(morgan('combined', { stream: accessLogStream }));
 }
 // 静态文件访问
-const uploadsDir = path.join(process.cwd(), 'uploads');
-router.use('/uploads', express.static(uploadsDir));
+app.use('/uploads', express.static(path.join(process.cwd(), 'uploads')));
 
 // 导入路由
 app.use('/api/v1', router);

+ 27 - 29
src/controller/fileController.ts

@@ -9,19 +9,19 @@ const file = {
   upload: async (req: any, res: any) => {
     if (!req.file) return resSend(res, 404, '请选择要上传的文件');
 
-    const { isDb } = req.body;
+    const { isDb, type = 'other' } = req.body;
 
-    const filePath = req.body.filePath || 'default';
+    const upPath = req.query.upPath || 'default';
 
     const file = req.file;
     const isImage = isImageFile(file.mimetype);
     const fileSize = file.size;
 
-    const baseUrl = `${req.protocol}://${req.get('host')}`;
+    let message = '文件上传成功';
+
     let result: any = {
-      originalUrl: `${baseUrl}/uploads/${path.basename(file.path)}`,
+      originalUrl: `/uploads/${upPath}/${path.basename(file.path)}`,
       compressedUrl: null,
-      message: '文件上传成功',
     };
 
     // 如果是图片且大于500KB,进行压缩
@@ -32,45 +32,43 @@ const file = {
       const compressionResult = await compressImage(file.path, compressedPath);
 
       if (compressionResult.success) {
-        result.compressedUrl = `${baseUrl}/uploads/${compressedFilename}`;
+        result.compressedUrl = `/uploads/${upPath}/${compressedFilename}`;
         result.compressedSize = compressionResult.finalSize;
-        result.message = `文件上传成功,图片已从${(fileSize / 1024).toFixed(2)}KB压缩至${(
+        message = `文件上传成功,图片已从${(fileSize / 1024).toFixed(2)}KB压缩至${(
           (compressionResult.finalSize || 0) / 1024
         ).toFixed(2)}KB`;
       } else {
-        result.message = '文件上传成功,但图片压缩失败,仅返回原图';
+        message = '文件上传成功,但图片压缩失败,仅返回原图';
       }
     }
 
     // 如果需要存储到数据库
     if (isDb === 'true') {
-      try {
-        const fileRecord = new Files({
-          filename: path.basename(file.filename),
-          originalName: file.originalname,
-          mimetype: file.mimetype,
-          size: file.size,
-          compressedSize: result.compressedSize || null,
-          path: file.path,
-          compressedPath: result.compressedUrl
-            ? path.join(path.dirname(file.path), path.basename(result.compressedUrl))
-            : null,
-          isImage: isImage,
-          updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
-        });
+      const fileRecord = new Files({
+        filename: path.basename(file.filename),
+        originalName: file.originalname,
+        mimetype: file.mimetype,
+        type,
+        size: file.size,
+        compressedSize: result.compressedSize || null,
+        path: file.path,
+        compressedPath: result.compressedUrl
+          ? path.join(path.dirname(file.path), path.basename(result.compressedUrl))
+          : null,
+        isImage: isImage,
+        updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+      });
 
-        await fileRecord.save();
-        result.dbRecordId = fileRecord._id;
-      } catch (dbError) {
-        console.error('数据库存储失败:', dbError);
-        result.dbError = '数据库存储失败,但文件已上传';
-      }
+      await fileRecord.save();
+      result._id = fileRecord._id;
+      result.type = fileRecord.type;
+      result.originalName = fileRecord.originalName;
     }
 
     // 记录API描述(根据您之前的代码风格)
     req.apiDescription = `文件上传-${file.originalname}`;
 
-    return resSend(res, 0, result.message, result);
+    return resSend(res, 0, message, result);
   },
 };
 

+ 13 - 8
src/middleware/fileUpload.ts

@@ -2,16 +2,21 @@ import multer from 'multer';
 import path from 'path';
 import fs from 'fs';
 
-// 创建上传目录
-const uploadDir = path.join(process.cwd(), 'uploads');
-if (!fs.existsSync(uploadDir)) {
-  fs.mkdirSync(uploadDir, { recursive: true });
-}
-
 // 配置 Multer 存储策略
 const storage = multer.diskStorage({
-  destination: (req, file, cb) => {
-    cb(null, uploadDir);
+  destination: (req: any, file, cb) => {
+    const upPath = req.query.upPath || 'default';
+
+    // 设置默认路径,如果 upPath 不存在
+    const baseDir = 'uploads';
+    const targetDir = upPath ? path.join(baseDir, upPath) : path.join(baseDir, 'default');
+
+    // 确保目录存在
+    if (!fs.existsSync(targetDir)) {
+      fs.mkdirSync(targetDir, { recursive: true });
+    }
+
+    cb(null, targetDir);
   },
   filename: (req, file, cb) => {
     const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9);

+ 1 - 0
src/model/fileModel.ts

@@ -14,6 +14,7 @@ const fileModel = new mongoose.Schema({
     type: String,
     required: true,
   },
+  type: String,
   size: {
     type: Number,
     required: true,