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了,勉強能用)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM