| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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);
- };
|