C#Core 1.1 Web API接收zip文件

时间:2017-10-02 08:25:48

标签: c# asp.net-web-api postman .net-core-1.1

我创建了Web API端点以接收类似于此

的zip文件
guard

我正试图通过Postman测试它并提出这样的要求: enter image description here enter image description here

但我得到异常“System.InvalidOperationException:Incorrect Content-Type:application / zip”

我做错了什么? 谢谢!

修改 请求实际上通过[Consumes(“application / zip”)]属性,但崩溃在“HttpContext.Request.Form.Files.FirstOrDefault();”

EDIT2 好吧,最后我成功收到了一个文件,当我没有在请求中放入任何标题并删除[Consumes(“application / zip”)]属性。在 [HttpPut()] [Consumes("application/zip")] public async Task<IActionResult> ImportZip() { var zipFile = HttpContext.Request.Form.Files.FirstOrDefault(); .... 我的文件有一个类型“application / x-zip-compressed”但是当我尝试在标题内容类型和Consumes属性中使用它时,我得到同样的崩溃Request.Form.Files

2 个答案:

答案 0 :(得分:1)

您可以使用IFormFile转移您的拉链。您的WebApi端点必须更新为:

 [HttpPut]
 [Consumes("multipart/form-data")]
 public void Put(IFormFile file)
 {
    var stream = file.OpenReadStream();
 }

邮递员请求看起来应该是这样的(您不需要Content-Type标题,因为它会根据请求得到解决):

enter image description here

答案 1 :(得分:1)

邮递员将multipart/form-data发送为Content-Type。 Normaly只有当web api操作必须支持多种内容类型或者您不支持特定内容类型时才指定Consumes属性。

由于您的网络API动作取决于HttpContext.Request.Form.FilesContent-Type无论如何都必须multipart/form-data

仅允许zip文件的最佳选择是尝试解析它。如果失败,您就知道上传了错误的文件。

[HttpPut("api/import")]
public IActionResult ImportZip()
{
    var file = Request.Form.Files.FirstOrDefault();
    if (file == null)
        return BadRequest();

    try
    {
        using (var zip = new ZipArchive(file.OpenReadStream()))
        {
            // do stuff with the zip file
        }
    }
    catch
    {
        return BadRequest();
    }

    return Ok();
}

另一种选择是检查文件的BOM (Byte order mark)