UploadPicture.js 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. const API = require("../../lib/API");
  2. const { v4: uuidv4 } = require('uuid');
  3. const { BaseStdResponse } = require("../../BaseStdResponse");
  4. const AccessControl = require("../../lib/AccessControl");
  5. const multer = require('multer');
  6. const path = require('path');
  7. const { url } = require("../../config.json")
  8. // 配置Multer的存储选项
  9. const storage = multer.diskStorage({
  10. destination: (req, file, cb) => {
  11. cb(null, 'uploads/');
  12. },
  13. filename: (req, file, cb) => {
  14. const fileName = uuidv4();
  15. const fileExtension = path.extname(file.originalname);
  16. cb(null, `${fileName}${fileExtension}`);
  17. }
  18. });
  19. // 限制文件类型
  20. const fileFilter = (req, file, cb) => {
  21. // 只接受以下扩展名的图片文件
  22. const allowedTypes = /jpeg|jpg|png|gif/;
  23. const extname = allowedTypes.test(path.extname(file.originalname).toLowerCase());
  24. const mimetype = allowedTypes.test(file.mimetype);
  25. if (extname && mimetype) {
  26. return cb(null, true);
  27. } else {
  28. cb(new Error('只允许上传图片文件 (jpeg, jpg, png, gif)'));
  29. }
  30. };
  31. // 初始化Multer中间件
  32. const upload = multer({
  33. storage: storage,
  34. fileFilter: fileFilter,
  35. limits: { fileSize: 3 * 1024 * 1024 } // 限制文件大小为3MB
  36. }).single('upload');
  37. class UploadAvatar extends API {
  38. constructor() {
  39. super();
  40. this.noEncrypt()
  41. this.setMethod("POST");
  42. this.setPath("/UploadPicture");
  43. }
  44. async onRequest(req, res) {
  45. // 使用Multer中间件处理文件上传
  46. upload(req, res, async (err) => {
  47. if (err) {
  48. this.logger.error(`图片上传失败!${err.stack || ''}`)
  49. return res.json({
  50. ...BaseStdResponse.ERR,
  51. msg: '图片上传失败!'
  52. });
  53. }
  54. let { uuid, session } = req.body
  55. if ([uuid, session].some(value => value === '' || value === null || value === undefined)) {
  56. return res.json({
  57. ...BaseStdResponse.MISSING_PARAMETER,
  58. endpoint: 1513126
  59. });
  60. }
  61. if (!await AccessControl.checkSession(uuid, session)) {
  62. return res.status(401).json({
  63. ...BaseStdResponse.ACCESS_DENIED,
  64. endpoint: 481545
  65. });
  66. }
  67. if (!req.file) {
  68. return res.json({
  69. ...BaseStdResponse.MISSING_PARAMETER,
  70. msg: '请上传图片文件'
  71. });
  72. }
  73. const picturePath = url + '/uploads/' + req.file.filename; // 获取文件路径
  74. res.json({
  75. ...BaseStdResponse.OK,
  76. data: {
  77. picturePath
  78. }
  79. });
  80. });
  81. }
  82. }
  83. module.exports.UploadAvatar = UploadAvatar;