1

我正在尝试使用 Ajax 将文件上传到 Nodejs 服务器。

阿贾克斯代码:

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();
    }
});

我在节点服务器中使用 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' 错误。所以任何人都可以帮助我摆脱这个错误。

4

2 回答 2

2

您应该使用 FormData API 而不是自己尝试。然后,当您将 FormData 实例传递给 时$.ajax(),它会自动为您设置正确的标题。这是一个例子

于 2014-09-15T02:00:29.923 回答
1

最好将FormDataMIME-Type 设置为'multipart/form-data'使用。FormData 中的键/值以查询的形式放置,并由“&”分隔。这是固定的并为服务器所知。

例子:category=laptop&brand=apple&price=150000,250000

但是对于文件,情况并非如此,因此我们必须提供一些方法,以便服务器上的代码可以将文件与其他数据分开。

为此,我们提供了一个边界值,用于标记文件数据的开始和结束。

使用contentType: 'multipart/form-data;boundary=abc'.

显然错误显示“多部分:未找到边界”,因此缺少边界

提供边界可以解决问题。

有关更多详细信息,请参阅:https ://stackoverflow.com/a/20321259

如果这不起作用,请尝试设置contentType: false

于 2016-09-04T18:48:46.210 回答