使用下面的代码,当我尝试上传文件时,浏览器会一直保持加载状态。知道为什么吗?
app.js
var formidable = require('formidable'),
http = require('http'),
util = require('util');
app.get('/song/add', function (req, res) {
res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/song/upload" enctype="multipart/form-data" method="post">'+
'<input type="text" name="title"><br>'+
'<input type="file" name="upload" multiple="multiple"><br>'+
'<input type="submit" value="Upload">'+
'</form>'
);
});
app.post('/song/upload', function (req, res) {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
return;
});
答案 0 :(得分:1)
您可能已启用快速正文解析器选项。检查您的配置,例如:
app.use(express.bodyParser())
我认为问题在于,Formidable期待此文件的流事件&amp;在调用app.post
回调时,它们已被Express使用。由于form.parse
回调仅在end
上触发,因此无法呈现任何响应。
解决方案是使用Express或Formidable,如果要使用Formidable,可以禁用配置选项。
答案 1 :(得分:1)
只需删除代码中的那一行(app.use(express.bodyParser())
)即可。我相信。
但你为什么要使用强大的?我相信快速体分析器基于强大的,它使用起来更干净。因为它甚至解析其他类型的主体,除了像JSON这样的表单类型,但是如果不支持主体类型,则强制执行会抛出错误。如果您的代码中有app.use(express.bodyParser())
,那么您可以执行此操作以获得所需内容:
app.post('/song/upload', function(req, res){
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect(req.body));
return;
});
答案 2 :(得分:0)
我在这里看到的问题是新的身体解析器(自Connect 1.8.0以来)。如果你想使用新的Connect with formidable,你需要从body解析器中删除多部分解析器:
delete express.bodyParser.parse['multipart/form-data'];
答案 3 :(得分:0)
不要将ExpressParser与Express 4.x一起使用: http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html
使用
app.use(express.json());
app.use(express.urlencoded());
代替。您的代码的问题是您将在调用回调之前返回,因此结果将不会发送给用户。
将您的代码更改为:
return res.end(util.inspect({fields:fields,files:files}));
并删除最后的回报。