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)。
我创建了 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)。