9

Express で node-formidable を使用してファイルをアップロードするのは、これと同じくらい簡単です。

app.post('/upload', function(req, res) {
    // do something with req.files
});

ファイルが保存されました

フォーム: (multiple="multiple" は、ユーザーが複数のファイルを選択してアップロードできるようにする HTML5 の機能です)

<form method="post" enctype="multipart/form-data" action="upload">
    <input type="text" name="title"/>
    <input type="file" name="upload" multiple="multiple"/>
    <input type="submit" value="upload" id="s3form_submit"/>
</form>

この行をアップロードコードに追加すると

console.log(req.files.upload.path);

1 つのファイルをアップロードすると、パスがコンソールに表示されます。しかし、複数のファイルをアップロードすると、コンソールに未定義と表示されます。各ファイルのログを取得するにはどうすればよいですか? for ループを使用していますか?

GitHub の node-formidable の例では、複数のファイルをアップロードするとすべてのファイルがログに記録されます: https://github.com/felixge/node-formidable/blob/master/example/upload.js (このコードを Express で使用しようとしましたが、そうではありませんでした仕事) それは私が望むことを正確に行いますが、Express アプリでこれを行うにはどうすればよいですか?

4

2 に答える 2

11

以下の行を app.configure 関数の一番下に移動することで機能します。Express のミドルウェアに関する順序の重要性については、http: //expressjs.com/guide.html#middlewareを参照してください。

app.use(express.bodyParser({ uploadDir:__dirname + '/public/uploads' }));

そして、このハンドラーを使用して:

app.post('/upload', function(req, res){
    var form = new formidable.IncomingForm(),
    files = [],
    fields = [];
    form.on('field', function(field, value) {
        fields.push([field, value]);
    })
    form.on('file', function(field, file) {
        console.log(file.name);
        files.push([field, file]);
    })
    form.on('end', function() {
        console.log('done');
        res.redirect('/forms');
    });
    form.parse(req);
});
于 2012-04-13T10:58:42.810 に答える
2

したがってreq.files、配列である可能性があります。ハンドラーでやってみてconsole.log(req.files)、それがどのように見えるかを見てください...しかし、私はあなたが彼らの例のようにそれをする方が良いと思います。../test/common上部のrequireを削除し、定数を静的な値に変更するだけで機能させることができます(たとえば、 TEST_TMPuseの代わりに__dirname + '/uploads')。

ハンドラー:

var form = new formidable.IncomingForm(),
    files = [],
    fields = [];

form.uploadDir = __dirname + '/uploads';

form
  .on('field', function(field, value) {
    console.log(field, value);
    fields.push([field, value]);
  })
  .on('file', function(field, file) {
    console.log(field, file);
    files.push([field, file]);
  })
  .on('end', function() {
    console.log('-> upload done');
    res.writeHead(200, {'content-type': 'text/plain'});
    res.write('received fields:\n\n '+util.inspect(fields));
    res.write('\n\n');
    res.end('received files:\n\n '+util.inspect(files));
  });
form.parse(req);

これで、ファイルはコンソールの出力(およびハンドラー__dirname + '/uploads'で確認できるように応答)に従って名前が付けられます。end

于 2012-04-12T16:46:23.313 に答える