seller 端商品字段批量维护工具
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. const express = require('express');
  2. const router = express.Router();
  3. const multer = require('multer');
  4. const OSS = require('ali-oss');
  5. const config = require('../config/oss');
  6. const path = require('path');
  7. const fs = require('fs');
  8. // 确保上传目录存在
  9. const uploadsDir = path.join(__dirname, '../uploads');
  10. if (!fs.existsSync(uploadsDir)) {
  11. fs.mkdirSync(uploadsDir, { recursive: true });
  12. }
  13. const upload = multer({
  14. storage: multer.memoryStorage(),
  15. limits: {
  16. fileSize: 5 * 1024 * 1024 // 限制5MB
  17. }
  18. }).array('images');
  19. router.post('/upload-images', (req, res) => {
  20. upload(req, res, async function(err) {
  21. if (err instanceof multer.MulterError) {
  22. console.error('Multer error:', err);
  23. return res.status(400).json({ error: '文件上传错误: ' + err.message });
  24. } else if (err) {
  25. console.error('Unknown error:', err);
  26. return res.status(500).json({ error: '未知错误: ' + err.message });
  27. }
  28. try {
  29. if (!req.files || req.files.length === 0) {
  30. return res.status(400).json({ error: '没有上传文件' });
  31. }
  32. // 验证OSS配置
  33. if (!config.accessKeyId || !config.accessKeySecret || !config.bucket || !config.endpoint) {
  34. console.error('OSS configuration missing:', config);
  35. return res.status(500).json({ error: 'OSS配置错误' });
  36. }
  37. const client = new OSS({
  38. accessKeyId: config.accessKeyId,
  39. accessKeySecret: config.accessKeySecret,
  40. bucket: config.bucket,
  41. endpoint: config.endpoint,
  42. secure: true
  43. });
  44. const uploadPromises = req.files.map(async file => {
  45. try {
  46. const fileExt = file.originalname.split('.').pop().toLowerCase();
  47. // 验证文件类型
  48. const allowedTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];
  49. if (!allowedTypes.includes(fileExt)) {
  50. throw new Error(`不支持的文件类型: ${fileExt}`);
  51. }
  52. const uniqueId = Math.random().toString(36).substring(2) + Date.now();
  53. const fileName = `ueditor/${uniqueId}.${fileExt}`;
  54. console.log('Uploading file to OSS:', fileName);
  55. const result = await client.put(fileName, file.buffer);
  56. console.log('Upload result:', result);
  57. return {
  58. url: `https://${config.bucket}.${config.endpoint}/${fileName}`,
  59. name: fileName.split('/').pop()
  60. };
  61. } catch (error) {
  62. console.error('Individual file upload error:', error);
  63. throw new Error(`文件 ${file.originalname} 上传失败: ${error.message}`);
  64. }
  65. });
  66. console.log('Processing all uploads...');
  67. const results = await Promise.all(uploadPromises);
  68. console.log('Upload results:', results);
  69. res.json(results);
  70. } catch (error) {
  71. console.error('Upload error:', error);
  72. res.status(500).json({
  73. error: error.message || '上传失败',
  74. details: error.stack
  75. });
  76. }
  77. });
  78. });
  79. module.exports = router;