46 lines
1.2 KiB
JavaScript
46 lines
1.2 KiB
JavaScript
const multer = require('multer');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
|
|
// 确保上传目录存在
|
|
const uploadDir = path.join(__dirname, '../uploads');
|
|
if (!fs.existsSync(uploadDir)) {
|
|
fs.mkdirSync(uploadDir, { recursive: true });
|
|
}
|
|
|
|
// 配置本地存储
|
|
const storage = multer.diskStorage({
|
|
destination: (req, file, cb) => {
|
|
cb(null, uploadDir);
|
|
},
|
|
filename: (req, file, cb) => {
|
|
const uniqueName = `${Date.now()}-${Math.random().toString(36).substring(7)}${path.extname(file.originalname)}`;
|
|
cb(null, uniqueName);
|
|
}
|
|
});
|
|
|
|
const upload = multer({
|
|
storage,
|
|
limits: { fileSize: 50 * 1024 * 1024 }, // 50MB
|
|
fileFilter: (req, file, cb) => {
|
|
const extname = /jpeg|jpg|png|gif|mp4|mov|avi/.test(
|
|
path.extname(file.originalname).toLowerCase()
|
|
);
|
|
const mimetype = /image|video/.test(file.mimetype);
|
|
if (mimetype && extname) return cb(null, true);
|
|
cb(new Error('只允许上传图片或视频文件'));
|
|
}
|
|
});
|
|
|
|
// 返回文件访问URL
|
|
const getFileUrls = (files) => {
|
|
const list = Array.isArray(files) ? files : [files];
|
|
return list.map(file => ({
|
|
url: `/uploads/${file.filename}`,
|
|
filename: file.filename,
|
|
mimetype: file.mimetype
|
|
}));
|
|
};
|
|
|
|
module.exports = { upload, getFileUrls };
|