const Busboy = require('busboy'); const fs = require('fs'); const checkTargetDir = require('./mkdir'); //缓存检测过的目录 const checkedMap = {}; /** * 获取上传文件的后缀名 * @param {string} fileName 上传的文件的文件名 * @return {string} 文件后缀名 */ function getSuffixName(filename) { let nameList = filename.split('.'); return nameList[nameList.length - 1]; } /** * 获取唯一的文件名 * @return {string} 文件名 */ function getOnlyName() { return Math.random().toString(16).substr(2); } /** * 初始化上传文件模块 * @param {string} target 上传文件的位置 * @param {string} checkedInterval 多久执行重新检测目录,默认为一天 * @return {async function} */ function init(target = './upload', checkedInterval = 24) { if (!checkedMap[target]) { checkedMap[target] = true; setInterval(() => checkedMap[target] = true, checkedInterval*60*60*1000) } /** * 上传文件,并生成唯一的文件名,根据上传时的文件名保持文件的后缀名 * @param {object} ctx koa2上下文 * @return {promise} */ return async function uploadFile(ctx) { let formData, busboy, req = ctx.req; if (checkedMap[target]) { await checkTargetDir(target); checkedMap[target] = false; } busboy = new Busboy({headers: ctx.headers}); formData = await new Promise((resolve, reject) => { let result = {}; busboy.on('file', (filedname, file, filename) => { let l_path = `${getOnlyName()}.${getSuffixName(filename)}`; file.pipe(fs.createWriteStream(`${target}/${l_path}`)); file.on('end', () => { result[filedname] = l_path; }); }); busboy.on('field', (filedname, val) => result[filedname] = val); busboy.on('finish', () => resolve(result)); busboy.on('error', err => reject(err)); req.pipe(busboy); }); return formData; } } module.exports = exports = init;