我尝试将一个简单的XHR上传到Node.js(通过Formidable)。问题是,如果我设置
xhr.setRequestHeader("Content-Type", "multipart/form-data");
节点给我错误:
Error: bad content-type header, no multipart boundary
如果我将边界设置为随机字符串,则不会发生任何事情。浏览器只挂起POST并等待服务器响应。
重点是,如果我使用带有常规同步POST的强大功能,一切正常。
有人试图将Formidable用于XHR上传吗?
答案 0 :(得分:13)
我明白了。我在客户端犯了一个小bug。
以下是使用Formidable
上传XHR的工作示例您不需要来设置任何边界或特殊标题。
<强>客户端强>
var formData = new FormData();
var xhr = new XMLHttpRequest();
var onProgress = function(e) {
if (e.lengthComputable) {
var percentComplete = (e.loaded/e.total)*100;
}
};
var onReady = function(e) {
// ready state
};
var onError = function(err) {
// something went wrong with upload
};
formData.append('files', file);
xhr.open('post', '/up', true);
xhr.addEventListener('error', onError, false);
xhr.addEventListener('progress', onProgress, false);
xhr.send(formData);
xhr.addEventListener('readystatechange', onReady, false);
服务器强>
app.post('/up', function(req, res) {
var form = new formidable.IncomingForm();
form.uploadDir = __dirname + '/tmp';
form.encoding = 'binary';
form.addListener('file', function(name, file) {
// do something with uploaded file
});
form.addListener('end', function() {
res.end();
});
form.parse(req, function(err, fields, files) {
if (err) {
console.log(err);
}
});
});
答案 1 :(得分:2)
我使用Formidable尝试了几个不同的东西,但从未能让它接受XHR上传。以下是我最后使用express进行文件上传的内容。
app.post('/upload', function (req,res){
if(req.xhr){
var fSize = req.header('x-file-size'),
fType = req.header('x-file-type'),
basename = require('path').basename,
fName = basename(req.header('x-file-name')),
ws = fs.createWriteStream('./temp/'+fName);
req.on('data', function(data) {
ws.write(data);
});
希望这有帮助。