const Busboy = require('busboy'); const fs = require('fs'); const checkTargetDir = require('./mkdir'); const path = require('path') /** * 获取上传文件的后缀名 * @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 {object} ctx koa2上下文 * @return {promise} */ async function uploadFile(ctx, target = './upload') { let formData, busboy, req = ctx.req; try { await checkTargetDir(target); } catch (e) { } busboy = new Busboy({headers: ctx.headers}); formData = await new Promise((resolve, reject) => { let result = {}; busboy.on('field', (filedname, val) => result[filedname] = val); busboy.on('file', async (filedname, file, filename) => { let locals = [] result.name && locals.push('/' + result.name) result.dir && locals.push('/' + result.dir) let local = path.join.apply(path, locals) let l_path = filename; if (result.random) { l_path = `${getOnlyName()}.${getSuffixName(filename)}`; } let fileDir = path.join(target, local) try { await checkTargetDir(fileDir) } catch (e) { } fileDir = path.join(fileDir, l_path) file.pipe(fs.createWriteStream(fileDir)); file.on('end', () => { result[filedname] = path.join(local, l_path); }); }); busboy.on('finish', () => resolve(result)); busboy.on('error', err => reject(err)); req.pipe(busboy); }); return formData; } module.exports = exports = uploadFile;