2016-05-05 28 views
2

Ich sehe viele Beispiele für WebAPIs Dateien akzeptieren. Wie auch immer, ich muss immer noch eine Lösung finden, warum, egal was ich versucht habe, meine HttpContext.Current.Request.Files jemals eine Datei darin haben, die ich über Postman in die Web API poste. (Ich habe dieses Bild auch über eine Konsolenanwendung gepostet und habe das gleiche Ergebnis erhalten)HttpContext.Current.Request.Files ist immer leer

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

Es ist eine sehr einfache Methode. Ich habe Postman verwendet, um eine binäre JPG-Datei zu veröffentlichen. Ich habe den content-type = "multipart/form-data" gesetzt. Kein Fehler ist in meinem Code, anders als die .Files = 0.

Ich habe einige zusätzliche Einstellungen in meiner WebApiConfig für den Rest der API, aber ich werde sie nur für den Fall, zusammen mit der Route für diese spezielle Methode:

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

ich auf Latein am Ende bin versucht, warum etwas so einfach, herauszufinden, funktioniert einfach nicht. Ich habe schon einige andere Methoden ausprobiert, die alle mehr MVC-ähnlich sind, aber das ist keine MVC-App, und sie haben verschiedene Fehler geworfen. Danke für jede Hilfe.

+0

Verwenden Sie den Radioknopf 'form-data' oder legen Sie einfach einen 'content-type'-Header fest? –

+0

Ich benutze die binäre Optionsschaltfläche und wähle eine JPG-Datei auf meinem lokalen Laufwerk. Ich setze auch den Content-Type-Header. –

+0

Ich habe auch eine brandneue Web-API erstellt und den voreingestellten ValuesController verwendet und versucht, ein Bild an sie zu senden, was zu dem gleichen Problem führte. –

Antwort

0

Ich habe auch eine Weile mit diesem Problem zu kämpfen, aber schließlich eine Lösung gefunden. In meinem Fall habe ich den Endpunkt von einer iOS-App aus angerufen und die Dateien waren immer leer. Ich fand, dass es ich brauche einen HTTP-Header haben, der die Datei Feldnamen in der Form übereinstimmt, so würde die Anforderung einen HTTP-Header zum Beispiel haben müssen:

file: newImage.jpg 

und im Inneren des Körpers des Ersuchens Sie benötigen würde so etwas wie

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

Bitte beachten Sie, dass dies nur ein Ausschnitt keine gültige Anforderung ist. Sie benötigen immer noch mehr HTTP-Header und die Grenzen um die Felder im Textkörper. Mein Punkt ist, dass es die Anforderung ist, dass HTTP-Header-Schlüssel und der Name des Formularfelds übereinstimmen und beide vorhanden sind.

0

ich die Ursache des Problems in allen wahrscheinlich Haube vermuten, ist dies, weil von dem, was Sie in Ihrem Beitrag erwähnt habe -

Ich habe Postman unter Verwendung einer Binary JPG-Datei zu schreiben. Ich habe die content-type = "multipart/form-data" gesetzt

Sie sollen nicht in Postbote Werkzeug dabei explizit werden. Postman-Tool ist intelligent genug, um automatisch Content-Type selbst zu erkennen. Bitte sehen Sie this Antwort von mir, um Ihnen mehr zu helfen.

Das Einrichten von Content-Type zu "multipart/form-data" beinhaltet ein komplexes Konzept von Begrenzungen mehrerer Teile, wie detailliert beschrieben here. Das Heben der Grenzen wird für Sie automatisch vom Postboten-Tool erledigt, weshalb Sie nicht möchten, dass Sie in diesem Fall explizit die content-type setzen.