使用带有Express的node-formidable上传它们时,可以处理多个文件

时间:2012-04-12 13:01:16

标签: node.js express

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

上传一个文件时,路径会显示在控制台中。但是当我上传多个文件时,它只是在控制台中显示为undefined。 如何获取每个文件的日志内容?使用for循环?

GitHub上的节点强大示例在您上传多个文件时记录每个文件:https://github.com/felixge/node-formidable/blob/master/example/upload.js(我尝试在Express中使用此代码,但无效) 它完全符合我的要求,但我如何在Express应用程序中执行此操作?

2 个答案:

答案 0 :(得分:10)

通过将下面的行移动到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);
});

谢谢Ryan!

答案 1 :(得分:1)

所以req.files可以是一个数组。尝试在处理程序中执行console.log(req.files)并看看它的样子......但我认为你最好只是在他们的例子中做这件事。只需删除顶部的../test/common要求并将常量更改为静态值(例如,而不是TEST_TMP使用__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处理程序中所示)。