upload.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. const Busboy = require('busboy');
  2. const fs = require('fs');
  3. const checkTargetDir = require('./mkdir');
  4. const path = require('path')
  5. /**
  6. * 获取上传文件的后缀名
  7. * @param {string} fileName 上传的文件的文件名
  8. * @return {string} 文件后缀名
  9. */
  10. function getSuffixName(filename) {
  11. let nameList = filename.split('.');
  12. return nameList[nameList.length - 1];
  13. }
  14. /**
  15. * 获取唯一的文件名
  16. * @return {string} 文件名
  17. */
  18. function getOnlyName() {
  19. return Math.random().toString(16).substr(2);
  20. }
  21. /**
  22. * 上传文件,并生成唯一的文件名,根据上传时的文件名保持文件的后缀名
  23. * @param {object} ctx koa2上下文
  24. * @return {promise}
  25. */
  26. async function uploadFile(ctx, target = './upload') {
  27. let formData, busboy,
  28. req = ctx.req;
  29. try {
  30. await checkTargetDir(target);
  31. } catch (e) {
  32. }
  33. busboy = new Busboy({headers: ctx.headers});
  34. formData = await new Promise((resolve, reject) => {
  35. let result = {};
  36. busboy.on('field', (filedname, val) => result[filedname] = val);
  37. busboy.on('file', async (filedname, file, filename) => {
  38. let locals = []
  39. result.name && locals.push('/' + result.name)
  40. result.dir && locals.push('/' + result.dir)
  41. let local = path.join.apply(path, locals)
  42. let l_path = filename;
  43. if (result.random) {
  44. l_path = `${getOnlyName()}.${getSuffixName(filename)}`;
  45. }
  46. let fileDir = path.join(target, local)
  47. try {
  48. await checkTargetDir(fileDir)
  49. } catch (e) {
  50. }
  51. fileDir = path.join(fileDir, l_path)
  52. file.pipe(fs.createWriteStream(fileDir));
  53. file.on('end', () => {
  54. result[filedname] = path.join(local, l_path);
  55. });
  56. });
  57. busboy.on('finish', () => resolve(result));
  58. busboy.on('error', err => reject(err));
  59. req.pipe(busboy);
  60. });
  61. return formData;
  62. }
  63. module.exports = exports = uploadFile;