我正在尝试使用Ajax将文件上传到Nodejs服务器。
Ajax代码:
var url = 'http://<ip:port>/upload/';
var formValues = $("#files").get(0).files;
$.ajax({
url: url,
type: 'POST',
data: formValues,
processData: false,
cache: false,
beforeSend: function( xhr ) {
xhr.setRequestHeader('content-type', 'multipart/form-data');
},
success: function (data) {
console.log("Store details: %j", data);
Backbone.history.navigate('store');
window.location.reload();
}
});
我在Node Server中使用busboy,当我试图解析请求标头以初始化busboy对象时,它给了我这个错误。
Error: Multipart: Boundary not found
at new Multipart (/home/ubuntu/MoojicDashboard/node_modules/busboy/lib/types/multipart.js:58:11)
at Multipart (/home/ubuntu/MoojicDashboard/node_modules/busboy/lib/types/multipart.js:26:12)
at Busboy.parseHeaders (/home/ubuntu/MoojicDashboard/node_modules/busboy/lib/main.js:62:22)
at new Busboy (/home/ubuntu/MoojicDashboard/node_modules/busboy/lib/main.js:21:10)
但是,如果我没有将内容类型设置为multipart / form-data,请求将被busboy丢弃。
我甚至尝试过使用multer包但它也给了我同样的错误。(后来我发现它是建立在busboy上的。)
我甚至尝试将contentType设置为false。
$.ajax({
url: url,
type: 'POST',
data: formValues,
processData: false,
cache: false,
contentType: false,
success: function (data) {
console.log("Store details: %j", data);
Backbone.history.navigate('store');
window.location.reload();
}
});
强制JQuery不要设置默认内容类型,但它也不起作用。
设置contentType:'multipart / form-data'也没有用,给我相同的'Multipart:Boundary not found'错误。所以任何人都可以帮助我摆脱这个错误。
答案 0 :(得分:2)
您应该使用FormData API而不是尝试自己动手。然后,当您将FormData实例传递给$.ajax()
时,它会自动为您设置正确的标题。 Here is an example
答案 1 :(得分:1)
最好将FormData
与MIME类型设置为&#39; multipart / form-data&#39; 。
FormData中的键/值以查询的形式存储,并由&#39;&amp;&#39;分隔。这是固定的,并为服务器所知。
示例:category=laptop&brand=apple&price=150000,250000
但是对于文件而言并非如此,所以我们必须提供一些方法,以便服务器上的代码可以从其他数据中分离出文件。
为此我们提供了一个标记文件数据开始和结束的边界值。
使用contentType: 'multipart/form-data;boundary=abc'
。
显然,错误显示 &#39;多部分:未找到边界&#39; ,因此缺少边界
提供边界可以解决问题。
有关详细信息,请参阅:https://stackoverflow.com/a/20321259
如果这不起作用,请尝试设置contentType: false