Express 4.0でのファイルのアップロード:req.files undefined


239

私は、Express 4.0で単純なファイルのアップロード機構作業を取得しようとしていますが、私は得続けるundefinedためreq.filesapp.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")

解決策以下のmscdex
による応答のおかげで、代わりにを使用するように切り替えました:busboybodyParser

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
これは複数のファイルでどのように機能しますか?
曲がりくねった14

@chovy複数のファイルで問題なく動作するはずです
mscdex

2
app.post( '/ fileupload'、busboy()、function(req、res){
Shimon Doodkin

良い解決策./files/アプリのホームディレクトリにディレクトリを作成する必要があることに注意したいと思います。そうしないと、アップロード後にエラーが発生します。
ソース

一時ファイルはどのように処理されますか?busboyはそれらを自動的に削除しますか?ディスクに保存する前に一時ファイルが削除されているのを見たことはありません。
ed-ta

回答:


210

このbody-parserモジュールは、JSONとURLエンコードされたフォームの送信のみを処理し、マルチパートは処理しません(ファイルをアップロードする場合など)。

マルチパートの場合は、connect-busboyor multerまたはorのようなものを使用する必要がありますconnect-multiparty(multiparty / formidableは、最初にExpress bodyParserミドルウェアで使用されていたものです)。また、FWIW、私はbusboyと呼ばれるさらに上位のレイヤーに取り組んでいreformedます。Expressミドルウェアが付属しており、個別に使用することもできます。


4
ありがとう、うまくいきました。connect-busboyただ使用する代わりに使用しましたがbusboy。元の投稿をソリューションで更新しました。
safwanc 2014

4
どうも!私connect-multipartyはこれらのオプションを最もよく見つけます!
neciu

ですreformedまだ開発中?githubでの最後のコミットは2014年からです...ところで、あなたの意見では、マルチパートフォームデータを処理するのに最適なモジュールは何ですか?「最高」とは、サポートが最高で、機能が多く(バグが少ない)、機能が多く、将来も長いものを意味します。最高のサポートとmulter思われたので選択しましたが、さらにサポートする必要があると思います。
nbro 2015

[編集:大丈夫です。以下の答えを見ただけです。]マルチパートをExpress 3.0で実行し、4.0で失敗しましたか?このチュートリアルでは3.4.8を使用しており、追加のミドルウェアを必要とせずにファイルをアップロードできるためです。blog.robertonodi.me/ simple
image

@thetrysteroリンクした特定の例のgithubリポジトリでは、依存関係が実際にリポジトリにチェックインされています。これらの依存関係を掘り下げると、Express 3.xとConnect 2.x(マルチパートモジュールがまだバンドルされている)が含まれていることがわかります。そのため、マルチパートの処理が「そのまま」機能していました。
mscdex 2016年

31

これが私がグーグルで見つけたものです:

var fileupload = require("express-fileupload");
app.use(fileupload());

これは非常に単純なアップロードのメカニズムです

app.post("/upload", function(req, res)
{
    var file;

    if(!req.files)
    {
        res.send("File was not found");
        return;
    }

    file = req.files.FormFieldName;  // here is the field name of the form

    res.send("File Uploaded");


});

大きなファイルには遅すぎる
エドゥアルド

3
使わなかったのfileupload
BrandonFlynn-NB

5
上記の回答が機能するためには、メインにこれ​​らの2行を追加する必要がありますapp.js const fileUpload = require('express-fileupload') app.use(fileUpload())
abhishake

11

それは次のようになりbody-parser ましたエクスプレス3にサポートアップロードファイルを、それは時にサポートがエクスプレス4のためにドロップされなかったもはや依存関係として接続を含みます

mscdexの回答でいくつかのモジュールを調べた後、それexpress-busboyははるかに優れた代替手段であり、ドロップイン置換に最も近いものであることがわかりました。私が気付いた唯一の違いは、アップロードされたファイルのプロパティでした。

console.log(req.files)body-parser(Express 3)を使用すると、次のようなオブジェクトが出力されます。

{ file: 
   { fieldName: 'file',
     originalFilename: '360px-Cute_Monkey_cropped.jpg',
     name: '360px-Cute_Monkey_cropped.jpg'
     path: 'uploads/6323-16v7rc.jpg',
     type: 'image/jpeg',
     headers: 
      { 'content-disposition': 'form-data; name="file"; filename="360px-Cute_Monkey_cropped.jpg"',
        'content-type': 'image/jpeg' },
     ws: 
      WriteStream { /* ... */ },
     size: 48614 } }

express-busboy(Express 4)のconsole.log(req.files)使用と比較して:

{ file: 
   { field: 'file',
     filename: '360px-Cute_Monkey_cropped.jpg',
     file: 'uploads/9749a8b6-f9cc-40a9-86f1-337a46e16e44/file/360px-Cute_Monkey_cropped.jpg',
     mimetype: 'image/jpeg',
     encoding: '7bit',
     truncated: false
     uuid: '9749a8b6-f9cc-40a9-86f1-337a46e16e44' } }

8

1)ファイルが実際にクライアント側から送信されていることを確認します。たとえば、Chromeコンソールで確認できます: スクリーンショット

2)NodeJSバックエンドの基本的な例を以下に示します。

const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();

app.use(fileUpload()); // Don't forget this line!

app.post('/upload', function(req, res) {
   console.log(req.files);
   res.send('UPLOADED!!!');
});

7

マルターは「multipart / form-data」を扱い、アップロードされたファイルとフォームデータをrequest.filesおよびrequest.bodyとしてリクエストで利用できるようにするミドルウェアです。

multerのインストール:- npm install multer --save

.htmlファイル:-

<form method="post" enctype="multipart/form-data" action="/upload">
    <input type="hidden" name="msgtype" value="2"/>
    <input type="file" name="avatar" />
    <input type="submit" value="Upload" />
</form>

.jsファイル:-

var express = require('express');
var multer = require('multer');
var app = express();
var server = require('http').createServer(app);
var port = process.env.PORT || 3000;
var upload = multer({ dest: 'uploads/' });

app.use(function (req, res, next) {
  console.log(req.files); // JSON Object
  next();
});

server.listen(port, function () {
  console.log('Server successfully running at:-', port);
});

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/file-upload.html');
})

app.post('/upload', upload.single('avatar'),  function(req, res) {
  console.log(req.files); // JSON Object
});

お役に立てれば!



0

問題が解決しました !!!!!!!

storage関数は一度も実行されなかったことが判明しました。として含める必要があったapp.use(upload)のでupload = multer({storage}).single('file');

 let storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, './storage')
          },
          filename: function (req, file, cb) {
            console.log(file) // this didn't print anything out so i assumed it was never excuted
            cb(null, file.fieldname + '-' + Date.now())
          }
    });

    const upload = multer({storage}).single('file');

-1

express-fileupload 最近でも機能する唯一のミドルウェアのように見えます。

同じ例では、multerconnect-multiparty未定義の値が与えreq.fileまたはreq.filesが、express-fileupload作品を。

そして、req.file / req.filesの空の値について多くの質問と問題が提起されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.