2016-05-05 58 views
2

我看到很多WebAPI接受文件的例子。然而,我還沒有找到一個解決方案,爲什麼,無論我嘗試過什麼,都要讓我的HttpContext.Current.Request.Files有一個文件,通過Postman發佈到Web API。 (我也通過控制檯應用程序發佈了該圖像並得到了相同的結果)HttpContext.Current.Request.Files始終是空的

[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)); 
    } 

這是一個非常簡單的方法。我一直在使用郵遞員發佈二進制.jpg文件。我已經設置了content-type =「multipart/form-data」。沒有錯誤拋出我的代碼,除了.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

您是使用'form-data'單選按鈕還是隻設置'content-type'標題? –

+0

我正在使用二進制單選按鈕,並選擇本地驅動器上的.jpg文件。我還設置了內容類型標題。 –

+0

我還創建了一個全新的Web API,並使用內置的默認ValuesController並試圖向其發佈圖像,並導致相同的問題。 –

回答

0

我也在這個問題上奮鬥了一段時間,但最終找到了解決方案。在我的情況下,我從iOS應用程序調用端點,並且始終爲空。我發現,我需要有一個形式相匹配的文件字段名稱http頭這樣的要求就必須有例如HTTP頭:

file: newImage.jpg 

,你將需要請求的體內像

Content-Disposition: form-data; name="file"; filename="newImage.jpg" 
Content-Type: image/jpg 

請注意,這不是一個有效的請求只是一個片段。你仍然需要更多的http標題和正文中字段的邊界。我的觀點是,它似乎要求是HTTP標頭鍵和表單字段名稱匹配,並存在。

0

我在所有可能的引擎蓋懷疑你的問題的根本原因是因爲這是你已經在你的文章中提到 -

我一直在使用郵差來發布二進制.jpg文件。我已經設置了 content-type =「multipart/form-data」

您不應該在郵遞員工具中明確這麼做。郵差工具足夠智能,可自行檢測Content-Type。請參閱我的this答案以幫助您更好地使用它。

Content-Type設置爲「multipart/form-data」涉及多個部分的邊界的複雜概念,詳細描述如下here。設置邊界的重要工作是由郵遞員工具自動完成的,這就是爲什麼它不希望你在這種情況下明確設置content-type