Express 4.0 で動作するシンプルなファイル アップロード メカニズムを取得しようとしていますが、本文にundefined
forが入り続けます。関連するコードは次のとおりです。req.files
app.post
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
//...
app.use(bodyParser({ uploadDir: path.join(__dirname, 'files'), keepExtensions: true }));
app.use(methodOverride());
//...
app.post('/fileupload', function (req, res) {
console.log(req.files);
res.send('ok');
});
.. および付随する Pug コード:
form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data")
input(type="file", name="file", id="file")
input(type="submit", value="Upload")
解決策
回答者のおかげでmscdexbusboy
以下では、の代わりにを使用するように切り替えましたbodyParser
。
var fs = require('fs');
var busboy = require('connect-busboy');
//...
app.use(busboy());
//...
app.post('/fileupload', function(req, res) {
var fstream;
req.pipe(req.busboy);
req.busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
fstream = fs.createWriteStream(__dirname + '/files/' + filename);
file.pipe(fstream);
fstream.on('close', function () {
res.redirect('back');
});
});
});
ベストアンサー1
のbody-parser
モジュールは、JSON および URL エンコードされたフォームの送信のみを処理し、マルチパート (ファイルをアップロードする場合に該当) は処理しません。
マルチパートの場合は、次のようなものを使用する必要があります。connect-busboy
またはmulter
またはconnect-multiparty
(multiparty/formidableは元々express bodyParserミドルウェアで使用されていたものです)。また、参考までに、私はbusboyの上にさらに高レベルのレイヤーを開発中です。reformed
Expressミドルウェアが付属しており、単独でも使用できます。