最近師弟師妹們在用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);
========================================================
更新:
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了,勉強能用)