在使用Express进行节点强大的上传时,请使用多个文件进行操作
在Express上上传文件与node-formidable一样简单
app.post('/upload', function(req, res) { // do something with req.files });
这些文件现在保存
表单:(多=“多”是一个HTML5function,允许用户select多个file upload)
<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);
上传一个文件时,path显示在控制台中。 但是当我上传多个文件时,它只是说在控制台中未定义。 我如何获得每个文件的日志? 使用for循环?
GitHub上的节点强大的例子,当你上传几个日志时logging每个文件: https : //github.com/felixge/node-formidable/blob/master/example/upload.js (我试过在Express中使用这个代码,没有工作)它正是我想要的,但我如何在快速应用程序中做到这一点?
它通过将下面的行移动到app.configure函数的底部来工作。 在这里阅读有关中间件订单的重要性: 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); });
谢谢瑞恩!
所以req.files
可以是一个数组。 尝试在处理程序中执行console.log(req.files)
,看看它是什么样的…但我认为你最好像在他们的例子中那样做。 你可以通过删除顶部的../test/common
require并将常量改为静态值(例如,而不是TEST_TMP
使用__dirname + '/uploads'
)来TEST_TMP
。
处理程序:
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
处理程序中看到的那样)。