import multer from '@koa/multer'; import fs from 'fs'; import path from 'path'; /** * 创建 multer 实例 * @param {Object} options - multer 配置选项 * @returns {Object} multer 实例 */ export const createMulter = (options = {}) => { // 默认配置 const defaultOptions = { dest: './public/uploads/', limits: { fileSize: 2 * 1024 * 1024, // 2MB } }; // 合并选项 const mergedOptions = { ...defaultOptions, ...options }; // 如果没有指定 storage,使用 diskStorage if (!mergedOptions.storage) { const uploadDir = mergedOptions.dest; // 确保上传目录存在 if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir, { recursive: true }); } mergedOptions.storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, uploadDir); }, filename: function (req, file, cb) { const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9); cb(null, uniqueSuffix + path.extname(file.originalname)); } }); } return multer(mergedOptions); }; // 默认 multer 实例 const defaultMulter = createMulter(); /** * 单文件上传中间件 * @param {string} fieldName - 表单字段名 * @param {Object} options - multer 配置选项 * @returns {Function} koa 中间件 */ export const uploadSingle = (fieldName = 'file', options = {}) => { if (Object.keys(options).length === 0) { return defaultMulter.single(fieldName); } return createMulter(options).single(fieldName); }; /** * 多文件上传中间件 * @param {string} fieldName - 表单字段名 * @param {number} maxCount - 最大文件数 * @param {Object} options - multer 配置选项 * @returns {Function} koa 中间件 */ export const uploadMultiple = (fieldName = 'files', maxCount = 5, options = {}) => { if (Object.keys(options).length === 0) { return defaultMulter.array(fieldName, maxCount); } return createMulter(options).array(fieldName, maxCount); };