const path = require('path'); const fs = require('fs'); const formidable = require('formidable') const {handle} = require("../tools/handle_cjs"); const result = require("../tools/result"); const log = require("../logger").logger("uploadMiddleware","info"); module.exports = function (config){ if(!config){ throw new Error('config is undefined'); } let _config = { tmp: config.tmp || './tmp', maxFileSize: config.maxFileSize || (1024*1024*2),// 默认2mb }; return async function upload(req,res,next){ log.info(`[文件上传] 开始接收上传文件`) let form = formidable.formidable({ uploadDir: _config.tmp, multiples: true, keepExtensions: true, type: true, maxFileSize: _config.maxFileSize, filename(_fileName, _extName) { // console.log('---------') // console.log(_fileName+'.'+_extName); // console.log('---------') let time = new Date(); // 生成随机数 let random = Math.floor(Math.random() * 1000); // 生成随机字符 let str = 'abcdefghijklmnopqrstuvwxyz'; let randomStr = ''; let fileName = ''; for (let i = 0; i < 5; i++) { randomStr += str.charAt(Math.floor(Math.random() * str.length)); } fileName = `${time.getTime()}-${random}-${randomStr}-${_fileName}${_extName}`; // // 随机从fileName中抽取2-6个字符添加至随机位置 // let randomIndex = Math.floor(Math.random() * (fileName.length - 2)) + 1; // let randomLength = Math.floor(Math.random() * 5) + 2; // let randomStr2 = ''; // for (let i = 0; i < randomLength; i++) { // randomStr2 += str.charAt(Math.floor(Math.random() * str.length)); // } // fileName = fileName.slice(0, randomIndex) + randomStr2 + fileName.slice(randomIndex); return fileName; } }); let allFile = []; let [err] = await handle(fs.promises.mkdir(_config.tmp)); if(!err){ // res.status(500); console.log(err); log.info(`[文件上传] 无法存储文件 ${err.message}`); result.ServerError(res, err, `无法存储文件 ${err.message}`); return; } await form.on('progress', function (bytesReceived, bytesExpected) { //在控制台打印文件上传进度 let progressInfo = { value: bytesReceived, //当前进度 total: bytesExpected //总进度 }; let bar_progress = Math.floor((progressInfo.value / progressInfo.total) * 100); // console.log(`当前进度: ${bar_progress}`); }).parse(req, function (err, fields, files) { if (err) { // res.status(500); log.info(`[文件上传] 文件上传失败 ${err.message}`); result.ServerError(res, err, `文件上传失败 ${err.message}`); } else { req.files = files; req.body = fields; next(); } }) } };