无法在 ASP.NET MVC 中将文件上传到服务器 - 计数始终为 0

问题描述

我正在尝试使用 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 请求的数据。