12

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

控制器如下所示:

    [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

4

5 回答 5

11

我在这里找到了 .Net Core 2.1/2.2 的解决方案

从 POSTMAN 发布多个文件

从 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");
    }
于 2019-12-18T09:27:46.023 回答
6

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

另外,不要忘记在邮递员中将请求的标头设置为: 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);
}
于 2018-07-19T14:12:19.767 回答
4

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

macOS 应用程序 macOS 应用程序

Chrome 扩展程序 在此处输入图像描述

于 2018-07-20T09:23:16.573 回答
3

我试过了,它奏效了。也许你忘记做某事。删除[FromBody]属性。

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

Postman 自动附加正确的Content-Type,在正文部分选择form-data选项并使用文件密钥添加您的文件。

它应该工作。

于 2018-07-19T16:14:14.660 回答
0

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

于 2018-12-06T14:22:15.420 回答