问题描述
我正在尝试使用 ASP.NET MVC 将文件上传到服务器。我正在使用 Ajax 和控制器,我的代码似乎可以正常工作,但无法将文件上传到服务器。
这是我的代码;你能告诉我我做错了什么吗?
function SubmitAddEdit(form) {
$.validator.unobtrusive.parse(form);
if ($(form).valid()) {
var data = $(form).serializeJSON();
data = JSON.stringify(data);
$.ajax({
type: 'POST',url: apiurl,data: data,contentType: 'application/json',success: function (data) {
if (data.success) {
popup.modal('hide');
ShowMessage(data.message);
dataTable.ajax.reload();
} else {
ShowMessageError(data.message);
}
}
});
}
return false;
}
<form onsubmit="return SubmitAddEdit(this)" enctype = "multipart/form-data">
<div class="col-lg-6">
<!-- The file input field used as target for the file upload widget -->
<input type="file" name="files" id="files" multiple="multiple">
</div>
</form>
public async Task<IActionResult> PostTicket(List<IFormFile> files,[FromBody] Ticket ticket)
{
var fileName = await _dotnetdesk.Ticket(files,_env);
}
public async Task<string> Ticket(List<IFormFile> files,IHostingEnvironment env)
{
var result = "";
var webroot = env.WebrootPath;
var uploads = System.IO.Path.Combine(webroot,"uploads");
var extension = "";
var filePath = "";
var fileName = "";
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
extension = System.IO.Path.GetExtension(formFile.FileName);
fileName = Guid.NewGuid().ToString() + extension;
filePath = System.IO.Path.Combine(uploads,fileName);
using (var stream = new FileStream(filePath,FileMode.Create))
{
await formFile.copyToAsync(stream);
}
result = fileName;
}
}
return result;
}
这是我通过 ASP.NET MVC 上传文件的代码,但它不会进入循环,每次我尝试调试文件时都会得到 0 的计数。请让我知道我做错了什么。
解决方法
这些行存在一个问题:
var data = $(form).serializeJSON();
data = JSON.stringify(data);
您不希望文件的字符串表示是一种非常低效的做事方式,而且我认为这种获取它的方法无论如何都行不通。
不要将表单字符串化,而是直接将其作为数据传入或构建一个新的 FormData
对象,如下所示:
var data = new FormData();
data.append('files',form.files.files)
并将其用作 Ajax 请求的数据。