1. ホーム
  2. node.js

[解決済み】Express 4.0でのファイルアップロード:req.filesは未定義です。

2022-04-04 09:14:29

質問

Express 4.0 で簡単なファイルアップロード機構を動作させようとしていますが、次のような問題が発生します。 undefined に対して 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")

解決方法

による対応に感謝します。 マスクデックス を使用するように変更しました。 busboy の代わりに 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');
        });
    });
});

解決方法は?

その body-parser モジュールは JSON と urlencoded フォーム送信のみを扱い、マルチパートは扱いません (ファイルをアップロードしている場合はそうなります)。

マルチパートの場合は、次のようなものを使用する必要があります。 connect-busboy または multer または connect-multiparty (multiparty/formidableはもともとexpress bodyParserのミドルウェアで使われていたものです)。また、参考までに、私はbusboyの上にさらに上位のレイヤーである reformed . Expressミドルウェアが付属しており、単体での利用も可能です。