fileController.ts 2.2 KB

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