带文件上载的FormData Ajax请求

时间:2016-06-02 21:13:12

标签: javascript jquery ajax asp.net-mvc

我一直在尝试将一组文件上传到MVC控制器,但到目前为止还没有成功,因为HttpPostedFileBase[]在控制器响应方法上变成了null

首先,我将多个上传的文件保存到这样的变量中:

$("#file").change(function () {
    fileArray[fileId] = this.files[0];
    fileId++;
});

将文件追加到数组中效果很好(使用Chrome调试器进行检查)。

稍后,当用户提交图像时,我将数据附加到FormData对象中:

var data = new FormData();

$.each(fileArray, function (key, value) {
    data.append('files[]', value);
});

然后我终于拨打AJAX电话:

    var serviceURL = '@Url.Action("OpenMaterialRequestSubmit", "OpenMaterialRequest")';

    $.ajax({
        type: "POST",
        url: serviceURL,
        data: data,
        cache: false,
        processData: false,
        contentType: false,
        success: successFunc,
        error: errorFunc
    });

我的控制器方法接收到以下标题:

[HttpPost]
public async Task<ActionResult> OpenMaterialRequestSubmit(HttpPostedFileBase[] files)
正如我已经说过的,{p> files总是null

在Google Chrome调试器上请求有效负载:

------WebKitFormBoundaryniIQHyAUAYUfecDX
Content-Disposition: form-data; name="files[]"; filename="Screen Shot 2015-12-03 at 9.19.02 AM.png"
Content-Type: image/png


------WebKitFormBoundaryniIQHyAUAYUfecDX--

有任何线索吗?

1 个答案:

答案 0 :(得分:1)

您需要将属性名称files[]更改为files

$.each(fileArray, function (key, value) {
    data.append('files', value);
});

附注:另一种方法是直接将文件添加到FormData事件中的.change对象

var data = new FormData();
$("#file").change(function () {
    data.append('files', $(this).get(0).files[0]);
});