在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应用程序中执行此操作?
答案 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
处理程序中所示)。