文件上传失败

时间:2014-09-12 09:23:37

标签: ajax node.js multer busboy

我正在尝试使用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'错误。所以任何人都可以帮助我摆脱这个错误。

2 个答案:

答案 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