fileController.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import dayjs from 'dayjs';
  2. import path from 'path';
  3. import resSend from '../util/resSend.js';
  4. import { isImageFile } from '../middleware/fileUpload.js';
  5. import { compressImage } from '../util/imageCompressor.js';
  6. import { Files } from '../model/index.js';
  7. const file = {
  8. upload: async (req: any, res: any) => {
  9. if (!req.file) return resSend(res, 404, '请选择要上传的文件');
  10. const { isDb, type: myType } = req.body;
  11. const upPath = req.query.upPath || 'default';
  12. const file = req.file;
  13. const isImage = isImageFile(file.mimetype);
  14. const fileSize = file.size;
  15. let message = '文件上传成功';
  16. let result: any = {
  17. originalName: file.originalname,
  18. originalUrl: `/uploads/${upPath}/${path.basename(file.path)}`,
  19. size: file.size,
  20. compressedUrl: '',
  21. };
  22. // 如果是图片且大于500KB,进行压缩
  23. if (isImage && fileSize > 500 * 1024) {
  24. const compressedFilename = 'compressed-' + path.basename(file.filename);
  25. const compressedPath = path.join(path.dirname(file.path), compressedFilename);
  26. const compressionResult = await compressImage(file.path, compressedPath);
  27. if (compressionResult.success) {
  28. result.compressedUrl = `/uploads/${upPath}/${compressedFilename}`;
  29. result.compressedSize = compressionResult.finalSize;
  30. message = `文件上传成功,图片已从${(fileSize / 1024).toFixed(2)}KB压缩至${(
  31. (compressionResult.finalSize || 0) / 1024
  32. ).toFixed(2)}KB`;
  33. } else {
  34. message = '文件上传成功,但图片压缩失败,仅返回原图';
  35. }
  36. }
  37. // 如果需要存储到数据库
  38. if (isDb === 'true') {
  39. const fileRecord = new Files({
  40. ...result,
  41. filename: path.basename(file.filename),
  42. mimetype: file.mimetype,
  43. type: myType || 'other',
  44. updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  45. });
  46. await fileRecord.save();
  47. result._id = fileRecord._id;
  48. result.type = fileRecord.type;
  49. result.updateTime = fileRecord.updateTime;
  50. }
  51. // 记录API描述(根据您之前的代码风格)
  52. req.apiDescription = `文件上传-${file.originalname}`;
  53. return resSend(res, 0, message, result);
  54. },
  55. };
  56. export default file;