.net core 2.1 "POST" 使用 Postman 的 IFormFile - 应用程序在未读取整个请求正文的情况下完成

.net core 2.1 "POST" an IFormFile using Postman - the application completed without reading the entire request body

我正在开发 dotnet 核心 WebAPI 2.1,但找不到将图像发送到 Body 的方法。

控制器看起来像这样:

    [HttpPost("api/image")]
    public IActionResult Post([FromBody]IFormFile file)
    {
        var filePath = Path.GetTempFileName();
        if (file.Length > 0)
        {
            return Ok();
        }
        return BadRequest();
    }

这是我的邮递员电话:

此调用永远不会完成,因为 Kestrel 失败

我已经尝试使用 Consumes

[Consumes("application/json", "application/json-patch+json", "multipart/from-data")]

同样在邮递员中,我将 Content-Type 设置为 multipart/form-data

尝试这样做。在您现在使用的邮递员中使用相同的请求。这只是粗略的样板方法,但你明白了。

此外,不要忘记将您在邮递员中的请求的 headers 设置为:Content-Type:multipart/form-data

[HttpPost]
[Route("api/image")]
public async Task<IHttpActionResult> InsertNewMerchant()
{
        // your form data is here
             var formData = HttpContext.Current.Request.Form;
             HttpFileCollection files = HttpContext.Current.Request.Files;


            if (files.Count == 1)
            {
            // this is the file you need 
                var image = files[0];
                    // do something with the file
            }
    return StatusCode(System.Net.HttpStatusCode.Created);
}

我试过了,成功了。也许你忘了做某事。 删除 [FromBody] 属性。

    [HttpPost("api/image")]
    public IActionResult Post(IFormFile file)
    {
        var filePath = Path.GetTempFileName();
        if (file.Length > 0)
        {
            return Ok();
        }
        return BadRequest();
    }

Postman 会自动在正文部分附加正确的 Content-Type、select form-data 选项并添加您的文件使用 file 键。

应该可以。

似乎 Postman macOS application 有错误问题。当我使用 postman chrome extension 时,一切都按预期工作。

MacOS 应用程序

Chrome 分机

我知道这个问题已经得到解答,但您似乎已经决定采用解决方法。您的端点和 Postman 请求都没有问题,我遇到了同样的问题,为我的 OS 安装本机 Postman 解决了问题 https://www.getpostman.com/apps

我找到了 .Net Core 2.1/2.2 的解决方案 here

POST multiple files from POSTMAN

POST single file from POSTMAN

    [HttpPost]
    public async Task<IActionResult> UploadSingleFile([FromForm(Name = "file")] IFormFile file)
    {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);
        var IDsList = new IDsList();

        try
        {
            var id = SaveFile(file);
            IDsList.Files.Add(new IDsList.FileInfo() { id = id, fileName = file.FileName });
        }
        catch (Exception ex)
        {
            return BadRequest(ex.Message);
        }

        return Content(JsonConvert.SerializeObject(IDsList), "application/json");
    }

    [HttpPost("UploadFiles")]
    public async Task<IActionResult> UploadFiles([FromForm(Name = "files")] ICollection<IFormFile> files)
    {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        //var files = Request.Form.Files?.GetFiles("files");
        String message = String.Empty;
        int filesCounter = 0;
        var IDsList = new IDsList();

        foreach (var file in files)
        {
            if (file.Length == 0)
                message = message + $"errorDescription {file.FileName}\n";

            try
            {
                var id = SaveFile(file);
                IDsList.Files.Add(new IDsList.FileInfo() { id = id, fileName = file.FileName });
                filesCounter++;
            }
            catch(Exception ex)
            {
                message = $"{message}{ex.Message}\n";
            }
        }

        IDsList.message = $"Amount: {filesCounter}.\n{message}";

        return Content(JsonConvert.SerializeObject(IDsList), "application/json");
    }