在ASP.net MVC中捕获ajax文件上传(html5)

时间:2013-10-28 20:14:08

标签: ajax html5 asp.net-mvc-4 file-upload

这里有什么问题?
ajax调用未到达操作

服务器端:

    [HttpPost]
    public ActionResult UploadFile(long someID, HttpPostedFileBase myFile)
    {
        return "hello";
    }

客户端html:

<form id="my-form" method="post" action="" enctype="multipart/form-data">
     <input type="hidden" name="someID" value="156" />
     <input type="file" name="myFile" />
</form>

客户端javascript:

$.ajax({
    async: true,
    type: 'POST',
    url: '/MyController/UploadFile/',
    data: new FormData($('#my-form')),
    success: function (data) {},
    cache: false,
    contentType: false,
    processData: false
});

在某些浏览器中应该可以通过ajax进行这种上传。

我收到此服务器端错误: 参数字典包含非可空类型'System.Int64'参数'someID'的空条目(...)

如果我将操作更改为UploadFile(),没有参数,则ajax调用会进入操作,但是如何恢复发布的数据?

2 个答案:

答案 0 :(得分:3)

如果您想要上传文件以及其他一些参数(在您的方案中就是这种情况),HttpPost处理程序只能包含其他参数。然后,您可以从Request对象获取发送到服务器的文件。

例如:

[HttpPost]
public ActionResult UploadFile(long someID)
{
    string filename = null;
    string fileType = null;
    byte[] fileContents = null;

    if (Request.Files.Count > 0) { //they're uploading the old way
        var file = Request.Files[0];
        fileContents = new byte[file.ContentLength];
        fileType = file.ContentType;
        filename = file.FileName;
    } else if (Request.ContentLength > 0) {
        fileContents = new byte[Request.ContentLength];
        Request.InputStream.Read(fileContents, 0, Request.ContentLength);
        filename = Request.Headers["X-File-Name"];
        fileType = Request.Headers["X-File-Type"];
    }
    //Now you have the file, continue with processing the POST request 
    //...
}

此示例来自此link,我发现在MVC的第一步中我非常有帮助。

答案 1 :(得分:3)

好吧,最后这样做了:

服务器端:

[HttpPost]
public ActionResult UploadFile(long someID)
{
    var file = Request.Files[0];
    return "hello";
}

客户端html:

 <form method="post" action="">
     <input type="hidden" id="someID" value="156" />
     <input type="file" id="myFile" />
 </form>

客户端javascript:

var blah = new FormData();
blah.append("file", $("#myFile")[0].files[0]);

$.ajax({
    async: true,
    type: 'POST',
    url: '/MyController/UploadFile/?someID='+ $("#someID").val(),
    data: blah,
    success: function (data) {},
    cache: false,
    contentType: false,
    processData: false
});

正如您所看到的, html表单甚至不是必需的,也不是enctype。 someID事物由URL传递,文件在Request.Files

中捕获