首页 > 解决方案 > 在 POST 请求中发送文件和元数据信息 ajax .NET core api 2.1

问题描述

我正在尝试通过 API 上传文件,但我还想将上下文信息添加到图像的上传中。我无法访问控制器本身。我收到以下错误:

应用程序在未阅读整个请求正文的情况下完成。

我读到这个错误可能是由于格式错误

我已成功上传文件并将其保存在我的计算机上,现在我希望能够接收文件和额外信息以对我的数据库发出查询请求。

我制作了一个应该可以工作的模型,但它没有。也许有人知道我做错了什么。

我相信存在输入格式错误。我不知道我怎么能找到确切的格式错误,因为考虑到它甚至不会进入控制器上下文,我不能做断点。

模型:

public class InfoPacket
{
    public string ExtraInfoTest{ get; set; }

    public List<IFormFile> files { get; set; }    
}// end packet

控制器:

[HttpPost]
[Route("uploadInformation")]
public void uploadImages(InfoPacket packet)
{

    for (int i = 0; i < packet.files.Count; i++)
    {

        //Get extension of the image
        string stride = Path.GetExtension(packet.files[i].FileName);

        //Get unique name for file
        var uniqueFileName = $@"{Guid.NewGuid()}" + stride;

        //Prepare saving path
        string savePath = "C:\\test\\" + uniqueFileName;

        using (var fileStream = new FileStream(savePath, FileMode.Create))
        {
            packet.files[i].CopyTo(fileStream);
            fileStream.Close();
        }

    }// end forloop
}// end function

JS/ajax 请求:

function uploadFiles(inputId) {

        var input = document.getElementById(inputId);
        var files = input.files;
        var packet = new FormData();

        packet.append("ExtraInfoTest", "Test");

        for (var i = 0; i != files.length; i++) {
            packet.append("files", files[i]);
            console.log(files[i]);
        }

        $.ajax(
            {
                url: "https://localhost:5001/api/images/uploadInformation",
                data: packet,
                processData: false,
                contentType: false,
                type: "POST",
                success: function (data) {
                    console.log("Files Uploaded!");
                },
                error: function (data) {
                    console.log(data, "error")
                }
            }
        );
    }

HTML 代码:

            <input id="files" name="files" type="file" size="1" multiple />

            <button onclick="uploadFiles('files')"> submit</button>

现在的目标是能够访问控制器(获取正确的输入格式,其余的应该很容易)。

标签: c#ajaxasp.net-corepost.net-core

解决方案


尝试使用[FromForm]attribute ,您的代码在我的测试中按预期工作:

public void uploadImages([FromForm]InfoPacket packet)

推荐阅读