【问题标题】:C# Core 1.1 Web API Receive zip fileC# Core 1.1 Web API 接收压缩文件
【发布时间】:2017-10-02 08:25:47
【问题描述】:

我创建了 Web API 端点来接收如下所示的 zip 文件

    [HttpPut()]
    [Consumes("application/zip")]
    public async Task<IActionResult> ImportZip()
    {
        var zipFile = HttpContext.Request.Form.Files.FirstOrDefault();
        ....

我正在尝试通过 Postman 进行测试,并提出这样的要求:

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

我做错了什么? 谢谢!

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

EDIT2 好的,所以当我没有在请求中放入任何标头并删除 [Consumes("application/zip")] 属性时,我终于成功地收到了一个文件。在Request.Form.Files 我的文件有一个类型“application/x-zip-compressed”但是当我试图在 headers content-type 和 Consumes 属性中使用它时我得到同样的崩溃System.InvalidOperationException: Incorrect Content-Type: application/x-zip-compressed

【问题讨论】:

  • 我很确定 application/zip 的内容类型对于您的 asp.net 核心应用程序是未知的。我认为您必须将您的 zip 上传为 application/octet-stream
  • @NtFreX - System.InvalidOperationException:不正确的内容类型:应用程序/八位字节流
  • 我觉得你还需要在postman中设置body type为binary
  • @NtFreX - 同样的事情......

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


【解决方案1】:

邮递员会将multipart/form-data 发送为Content-Type。通常,只有当 Web api 操作必须支持多种内容类型或您不想支持特定内容类型时,您才需要指定 Consumes 属性。

由于您的 Web api 操作依赖于 HttpContext.Request.Form.Files,因此 Content-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)

【讨论】:

    【解决方案2】:

    您可以使用IFormFile 来传输您的 zip。您的 WebApi 端点必须更新为:

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

    邮递员请求应如下所示(您不需要 Content-Type 标头,因为它会根据请求得到解决):

    【讨论】:

    • 谢谢,@Oluwafemi!它实际上正在工作,通过这种方法,我可以像以前一样从请求中读取文件 (HttpContext.Request.Form.Files.FirstOrDefault();)。但据我了解 - 请求中的所有文件都将被读取,我只想限制 zip
    猜你喜欢
    • 1970-01-01
    • 2023-02-19
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2017-11-22
    相关资源
    最近更新 更多