我创建了Web API端点以接收类似于此
的zip文件guard
但我得到异常“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
答案 0 :(得分:1)
您可以使用IFormFile
转移您的拉链。您的WebApi端点必须更新为:
[HttpPut]
[Consumes("multipart/form-data")]
public void Put(IFormFile file)
{
var stream = file.OpenReadStream();
}
邮递员请求看起来应该是这样的(您不需要Content-Type
标题,因为它会根据请求得到解决):
答案 1 :(得分:1)
邮递员将multipart/form-data
发送为Content-Type
。 Normaly只有当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)。