UploadAvatar.js 3.6 KB

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