我看到很多WebAPI接受文件的例子。但是,我还没有找到一个解决方案,为什么,无论我尝试过什么,让我的HttpContext.Current.Request.Files在其中有一个文件,我通过Postman发布到Web API 。 (我还通过控制台应用程序发布了该图像并获得了相同的结果)
[HttpPost]
[ActionName("Post")]
[ResponseType(typeof(PeliquinApiRsp))]
public IHttpActionResult Post(int personId)
{
var empPicture = PeliquinIOC.Resolve<IEmpPictureBL>(UserId, UserName, PropertyCode);
if (!(IsAllowed(SysPrivConstants.SYSPRIV__TYPE_PERSONNEL, SysPrivConstants.SYSPRIV__FUNC_PERSONNEL_CARDHOLDER, SysPrivConstants.SYSPRIV__LEVEL_FULL)))
return (Unauthorized());
var apiRsp = new PeliquinApiRsp();
var httpRequest = HttpContext.Current.Request;
if (httpRequest.Files.Count == 0)
return BadRequest();
empPicture.Post(httpRequest.Files[0].InputStream, personId);
apiRsp.SetStatus();
apiRsp.SetData("EmpPicture");
return (Ok(apiRsp));
}
这是一种非常简单的方法。我一直在使用Postman发布Binary .jpg文件。我已经设置了content-type =&#34; multipart / form-data&#34;。除了.Files = 0。
之外,我的代码中没有错误我的WebApiConfig中有一些额外的设置用于API的其余部分,但我会包含它们以及这个特定方法的路径:
config.Formatters.Remove( config.Formatters.XmlFormatter );
config.Formatters.JsonFormatter.SupportedMediaTypes.Add( new MediaTypeHeaderValue( "application/json" ) );
config.Formatters.FormUrlEncodedFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
config.Routes.MapHttpRoute(
name: "EmpPicturePost",
routeTemplate: "api/EmpPicture/{personId}",
defaults: new { controller = "EmpPicture", action = "Post" },
constraints: new { personId = @"^\d+$", httpMethod = new HttpMethodConstraint(HttpMethod.Post, HttpMethod.Options) }
);
我最终想知道为什么这么简单,只是不起作用。我已经尝试了很多其他方式,这些都是类似MVC的,但这不是一个MVC应用程序,他们抛出了不同的错误。谢谢你的帮助。
答案 0 :(得分:0)
我也一直在努力解决这个问题,但最终找到了解决方案。在我的情况下,我从iOS应用程序调用端点,并且文件始终为空。我发现我需要一个与表单中的文件字段名称匹配的http标头,因此请求必须有一个http标头,例如:
file: newImage.jpg
并且在请求正文中你需要像
这样的东西Content-Disposition: form-data; name="file"; filename="newImage.jpg"
Content-Type: image/jpg
请注意,这不是一个有效的请求只是一个片段。您仍然需要更多的http标头和正文中字段的边界。我的观点是,似乎要求http标头密钥和表单字段名称匹配并且两者都存在。
答案 1 :(得分:0)
我怀疑在所有可能的情况下你的问题的根本原因是因为你在帖子中提到的 -
我一直在使用Postman发布二进制.jpg文件。我已经设定了 content-type =&#34; multipart / form-data&#34;
你不应该在postman工具中明确这样做。邮差工具非常智能,可以自行检测Content-Type
。请参阅我的this回答以帮助您了解更多信息。
将Content-Type
设置为&#34; multipart / form-data&#34;涉及多个部分边界的复杂概念,如详细here。设置边界的繁重工作是通过邮递员工具自动完成的,这就是为什么它不希望您在这种情况下明确设置content-type
。
答案 2 :(得分:0)
我认为Postman无法填充HttpContext.Current.Request.Files 采集。我们使用以下方法解决了该问题: 等待Request.Content.ReadAsByteArrayAsync()。ConfigureAwait(false);
伊沃(Ivo)