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);

上传一个文件时,路径会显示在控制台中。但是当我上传多个文件时,它只会在控制台中显示未定义。如何获取每个文件的日志内容?使用 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 回答