123 lines
3.8 KiB
JavaScript
123 lines
3.8 KiB
JavaScript
const express = require('express');
|
|
const multer = require('multer');
|
|
const path = require('path');
|
|
const COS = require('cos-nodejs-sdk-v5');
|
|
const { authenticate } = require('../middleware/auth');
|
|
|
|
const router = express.Router();
|
|
|
|
// COS配置从环境变量读取,不再硬编码密钥
|
|
const cos = new COS({
|
|
SecretId: process.env.TENCENT_SECRET_ID,
|
|
SecretKey: process.env.TENCENT_SECRET_KEY
|
|
});
|
|
|
|
const cosConfig = {
|
|
Bucket: process.env.COS_BUCKET || 'qingyuan-erp-files-1310040146',
|
|
Region: process.env.COS_REGION || 'ap-hongkong'
|
|
};
|
|
|
|
const imageFormats = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'];
|
|
|
|
const upload = multer({
|
|
storage: multer.memoryStorage(),
|
|
limits: { fileSize: 50 * 1024 * 1024 }
|
|
});
|
|
|
|
// 所有上传接口都需要认证
|
|
router.post('/single', authenticate, upload.single('file'), (req, res) => {
|
|
try {
|
|
if (!req.file) {
|
|
return res.status(400).json({ success: false, error: '没有上传文件' });
|
|
}
|
|
|
|
const ext = req.file.originalname.split('.').pop().toLowerCase();
|
|
const timestamp = Date.now();
|
|
const randomStr = Math.random().toString(36).substring(2, 8);
|
|
const filename = 'uploads/' + timestamp + '_' + randomStr + '.' + ext;
|
|
|
|
|
|
cos.putObject({
|
|
Bucket: cosConfig.Bucket,
|
|
Region: cosConfig.Region,
|
|
Key: filename,
|
|
Body: req.file.buffer,
|
|
ContentType: req.file.mimetype,
|
|
ACL: 'public-read'
|
|
}, (err, data) => {
|
|
if (err) {
|
|
console.error('COS 上传失败:', err);
|
|
return res.status(500).json({ success: false, error: '上传失败' });
|
|
}
|
|
|
|
|
|
const permanentUrl = 'https://' + cosConfig.Bucket + '.cos.' + cosConfig.Region + '.myqcloud.com/' + filename;
|
|
|
|
|
|
res.json({
|
|
success: true,
|
|
data: {
|
|
url: permanentUrl,
|
|
key: filename,
|
|
name: req.file.originalname,
|
|
size: req.file.size,
|
|
type: req.file.mimetype,
|
|
isImage: imageFormats.includes(ext)
|
|
},
|
|
message: '文件上传成功'
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('上传异常:', error);
|
|
res.status(500).json({ success: false, error: '上传失败' });
|
|
}
|
|
});
|
|
|
|
router.post('/multiple', authenticate, upload.array('files', 10), (req, res) => {
|
|
try {
|
|
if (!req.files || req.files.length === 0) {
|
|
return res.status(400).json({ success: false, error: '没有上传文件' });
|
|
}
|
|
|
|
const uploadPromises = req.files.map(file => {
|
|
return new Promise((resolve, reject) => {
|
|
const ext = file.originalname.split('.').pop().toLowerCase();
|
|
const filename = 'uploads/' + Date.now() + '_' + Math.random().toString(36).substring(2, 8) + '.' + ext;
|
|
|
|
cos.putObject({
|
|
Bucket: cosConfig.Bucket,
|
|
Region: cosConfig.Region,
|
|
Key: filename,
|
|
Body: file.buffer,
|
|
ContentType: file.mimetype,
|
|
ACL: 'public-read'
|
|
}, (err, data) => {
|
|
if (err) reject(err);
|
|
else {
|
|
const permanentUrl = 'https://' + cosConfig.Bucket + '.cos.' + cosConfig.Region + '.myqcloud.com/' + filename;
|
|
resolve({
|
|
url: permanentUrl,
|
|
key: filename,
|
|
name: file.originalname,
|
|
size: file.size,
|
|
isImage: imageFormats.includes(ext)
|
|
});
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
Promise.all(uploadPromises)
|
|
.then(results => res.json({ success: true, data: results }))
|
|
.catch(error => {
|
|
console.error('批量上传失败:', error);
|
|
res.status(500).json({ success: false, error: '上传失败' });
|
|
});
|
|
} catch (error) {
|
|
console.error('批量上传异常:', error);
|
|
res.status(500).json({ success: false, error: '上传失败' });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|