nodejs使用multiparty模块实现文件上传,另附express.bodyParser(的说明

最近师弟师妹们在用formidable做文件上传的时候会出现form.parse()不会触发的问题,在stackoverflow也没有找到答案,反而是几个答案推荐使用multiparty来代替,因为那个是express官方支持的包,用法上其实和formidable是类似的,在这里记录一下。

var multiparty = require('multiparty');
var http = require('http');
var util = require('util');
var fs = require("fs");
 
http.createServer(function(req, res) {
  if (req.url === '/upload' && req.method === 'POST') {
    // 解析一个文件上传
    var form = new multiparty.Form();
    //设置编辑
    form.encoding = 'utf-8';
    //设置文件存储路径
    form.uploadDir = "uploads/images/";
    //设置单文件大小限制
    form.maxFilesSize = 2 * 1024 * 1024;
    //form.maxFields = 1000;  设置所以文件的大小总和
    
    form.parse(req, function(err, fields, files) {
      console.log(files.originalFilename);
      console.log(files.path);

      //同步重命名文件名
      fs.renameSync(files.path,files.originalFilename);
      
      res.writeHead(200, {'content-type': 'text/plain'});
      res.write('received upload:\n\n');
      res.end(util.inspect({fields: fields, files: files}));
    });
 
    return;
  }
 
  // show a file upload form
  res.writeHead(200, {'content-type': 'text/html'});
  res.end(
    '<form action="/upload" enctype="multipart/form-data" method="post">'+
    '<input type="text" name="title"><br>'+
    '<input type="file" name="upload" multiple="multiple"><br>'+
    '<input type="submit" value="Upload">'+
    '</form>'
  );
}).listen(8080);

multiparty API参考

========================================================

更新:

form.parse()不会触发的原因是:app.use(express.bodyParser())这一句处理了文件类型的post,所以导致那些第三方包对文件的处理都不起作用了。

express.bodyParser实际上包括了三部分:express.json, express.urlencoded, 和 express.multipart(就是处理了文件的部分),所以我们实际上只需要它的前两部分就够了。(参考stackoverflow

问题不是出在formidable上,所以正确的做法是:

// 将:
app.use(express.bodyParser());

// 改为:
app.use(express.json());
app.use(express.urlencoded());

(这是express 3的写法,express 4中bodyParser已成为了一个独立的中间件。之所以要这样写是因为老师非常坑爹地给了同学们一个用express 2写的种子项目,而express 2中没有express.json()和express.urlencoded()方法,改成express 4要大刀阔斧地改,只好折衷用express 3了,勉强能用)