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