upload.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. const path = require('path');
  2. const fs = require('fs');
  3. const formidable = require('formidable')
  4. const {handle} = require("../tools/handle_cjs");
  5. const result = require("../tools/result");
  6. const log = require("../logger").logger("uploadMiddleware","info");
  7. module.exports = function (config){
  8. if(!config){
  9. throw new Error('config is undefined');
  10. }
  11. let _config = {
  12. tmp: config.tmp || './tmp',
  13. maxFileSize: config.maxFileSize || (1024*1024*2),// 默认2mb
  14. };
  15. return async function upload(req,res,next){
  16. log.info(`[文件上传] 开始接收上传文件`)
  17. let form = formidable.formidable({
  18. uploadDir: _config.tmp,
  19. multiples: true,
  20. keepExtensions: true,
  21. type: true,
  22. maxFileSize: _config.maxFileSize,
  23. filename(_fileName, _extName) {
  24. // console.log('---------')
  25. // console.log(_fileName+'.'+_extName);
  26. // console.log('---------')
  27. let time = new Date();
  28. // 生成随机数
  29. let random = Math.floor(Math.random() * 1000);
  30. // 生成随机字符
  31. let str = 'abcdefghijklmnopqrstuvwxyz';
  32. let randomStr = '';
  33. let fileName = '';
  34. for (let i = 0; i < 5; i++) {
  35. randomStr += str.charAt(Math.floor(Math.random() * str.length));
  36. }
  37. fileName = `${time.getTime()}-${random}-${randomStr}-${_fileName}${_extName}`;
  38. // // 随机从fileName中抽取2-6个字符添加至随机位置
  39. // let randomIndex = Math.floor(Math.random() * (fileName.length - 2)) + 1;
  40. // let randomLength = Math.floor(Math.random() * 5) + 2;
  41. // let randomStr2 = '';
  42. // for (let i = 0; i < randomLength; i++) {
  43. // randomStr2 += str.charAt(Math.floor(Math.random() * str.length));
  44. // }
  45. // fileName = fileName.slice(0, randomIndex) + randomStr2 + fileName.slice(randomIndex);
  46. return fileName;
  47. }
  48. });
  49. let allFile = [];
  50. let [err] = await handle(fs.promises.mkdir(_config.tmp));
  51. if(!err){
  52. // res.status(500);
  53. console.log(err);
  54. log.info(`[文件上传] 无法存储文件 ${err.message}`);
  55. result.ServerError(res, err, `无法存储文件 ${err.message}`);
  56. return;
  57. }
  58. await form.on('progress', function (bytesReceived, bytesExpected) { //在控制台打印文件上传进度
  59. let progressInfo = {
  60. value: bytesReceived, //当前进度
  61. total: bytesExpected //总进度
  62. };
  63. let bar_progress = Math.floor((progressInfo.value / progressInfo.total) * 100);
  64. // console.log(`当前进度: ${bar_progress}`);
  65. }).parse(req, function (err, fields, files) {
  66. if (err) {
  67. // res.status(500);
  68. log.info(`[文件上传] 文件上传失败 ${err.message}`);
  69. result.ServerError(res, err, `文件上传失败 ${err.message}`);
  70. } else {
  71. req.files = files;
  72. req.body = fields;
  73. next();
  74. }
  75. })
  76. }
  77. };