upload.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. const Busboy = require('busboy');
  2. const fs = require('fs');
  3. const checkTargetDir = require('./mkdir');
  4. //缓存检测过的目录
  5. const checkedMap = {};
  6. /**
  7. * 获取上传文件的后缀名
  8. * @param {string} fileName 上传的文件的文件名
  9. * @return {string} 文件后缀名
  10. */
  11. function getSuffixName(filename) {
  12. let nameList = filename.split('.');
  13. return nameList[nameList.length - 1];
  14. }
  15. /**
  16. * 获取唯一的文件名
  17. * @return {string} 文件名
  18. */
  19. function getOnlyName() {
  20. return Math.random().toString(16).substr(2);
  21. }
  22. /**
  23. * 初始化上传文件模块
  24. * @param {string} target 上传文件的位置
  25. * @param {string} checkedInterval 多久执行重新检测目录,默认为一天
  26. * @return {async function}
  27. */
  28. function init(target = './upload', checkedInterval = 24) {
  29. if (!checkedMap[target]) {
  30. checkedMap[target] = true;
  31. setInterval(() => checkedMap[target] = true, checkedInterval*60*60*1000)
  32. }
  33. /**
  34. * 上传文件,并生成唯一的文件名,根据上传时的文件名保持文件的后缀名
  35. * @param {object} ctx koa2上下文
  36. * @return {promise}
  37. */
  38. return async function uploadFile(ctx) {
  39. let formData, busboy,
  40. req = ctx.req;
  41. if (checkedMap[target]) {
  42. await checkTargetDir(target);
  43. checkedMap[target] = false;
  44. }
  45. busboy = new Busboy({headers: ctx.headers});
  46. formData = await new Promise((resolve, reject) => {
  47. let result = {};
  48. busboy.on('file', (filedname, file, filename) => {
  49. let l_path = `${getOnlyName()}.${getSuffixName(filename)}`;
  50. file.pipe(fs.createWriteStream(`${target}/${l_path}`));
  51. file.on('end', () => {
  52. result[filedname] = l_path;
  53. });
  54. });
  55. busboy.on('field', (filedname, val) => result[filedname] = val);
  56. busboy.on('finish', () => resolve(result));
  57. busboy.on('error', err => reject(err));
  58. req.pipe(busboy);
  59. });
  60. return formData;
  61. }
  62. }
  63. module.exports = exports = init;