这里有什么问题?
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调用会进入操作,但是如何恢复发布的数据?
答案 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
中捕获