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