123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- 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;
|