C# Core 1.1 Web API 接收 zip 文件

C# Core 1.1 Web API Receive zip file

我创建了 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 好的,当我没有在请求中放置任何 header 并删除 [Consumes("application/zip")] 属性时,我终于成功收到了一个文件。在 Request.Form.Files 我的文件有一个类型 "application/x-zip-compressed" 但是当我试图在 headers content-type 和 Consumes 属性中使用它时我得到同样的崩溃 System.InvalidOperationException: Incorrect Content-Type: application/x-zip-compressed

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

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

邮递员请求应该看起来像这样(你不需要 Content-Type header 因为它会根据请求得到解决):

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

由于您的网络 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)