UploadAvatar.js 3.2 KB

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