2015-05-27 4 views
24

Ich muss zu einem Api Controller w/JSON (vorzugsweise) mit ONE Anfrage.Post JSON mit Daten UND Datei zu Web Api - jQuery/MVC

Das Problem besteht darin, Daten UND eine Datei (Bild hochgeladen) zu übergeben. Mein Eigentum steht leer (null).

Ich habe mir ziemlich viele Blogs angeschaut, aber ich kann nicht scheinen, dass die Bilddaten übertragen werden.

public class SomeModel 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public string City { get; set; } 
    public HttpPostedFileBase Image { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string CountryCode { get; set; } 
} 


    [HttpPost] 
    public void CreateContestEntry(SomeModel model) 
    { 
     // model.Image is always null 
     // .. get image here - the other properties no issues 
    } 

jQuery

// create model for controller 
    var model = { 
     Name: $.trim($contestForm.find('[name="nombre"]').val()) + ' ' + $.trim($contestForm.find('[name="apellido"]').val()), 
     Email: $.trim($contestForm.find('[name="email"]').val().toLowerCase()), 
     City: $.trim($contestForm.find('[name="cuidad"]').val()), 
     Title: $.trim($contestForm.find('[name="title"]').val()), 
     Description: $.trim($contestForm.find('[name="description"]').val()), 
     CountryCode: 'co', 
     Image: $contestForm.find('[name="file-es"]')[0].files[0] // this has the file for sure 
    }; 

    $.ajax({ 
     url: '/Umbraco/api/ControllerName/CreateContestEntry', 
     type: 'POST', 
     dataType: 'json', 
     data: JSON.stringify(model), 
     //data: $('#test-form').serialize(), // tried this and using FormData() 
     processData: false, 
     async: false, 
     contentType: 'application/json; charset=utf-8', 
     complete: function (data) { 

     }, 
     error: function (response) { 
      console.log(response.responseText); 
     } 
    }); 

enter image description here

Blogs Ich habe betrachtet:


Als ich die FormData und $('#form1').serialize() Ansatz versucht, meine provider.FileData und provider.FormData immer auch leer waren. Ich entfernte den model Parameter von der Methode und die Unterbrechungspunkte trafen, als ich ihn schaltete.

[HttpPost] 
    public void CreateContestEntry() 
    { 
     string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
     var provider = new MultipartFormDataStreamProvider(root); 

     try 
     { 
      // Read the form data. 
      Request.Content.ReadAsMultipartAsync(provider); 

      // This illustrates how to get the file names. 
      foreach (MultipartFileData file in provider.FileData) 
      { 
       // empty 
      } 

      foreach (var key in provider.FormData.AllKeys) 
      { 
       foreach (var val in provider.FormData.GetValues(key)) 
       { 
        // empty 
       } 
      } 
      //return Request.CreateResponse(HttpStatusCode.OK); 
     } 
     catch(Exception ex) 
     { 

     } 
    } 

LÖSUNG:

abgehend von @ Musa Antwort, hier ist der Api-Code-Controller. Ich habe die NameValueCollection meinem Modell zugeordnet.

Antwort

20

Sie können keine Datei (also beliebige Binärdaten) mit JSON hochladen, da JSON ein Textformat ist. Sie müssen mehrteilige Formulardaten verwenden.

+0

Erhalten Sie weiterhin Fehler auf 'var model = new FormData();' Uncaught TypeError: Objekt ist keine Funktion. Und ja, ich habe mein vorheriges Modellobjekt auskommentiert, also habe ich die Variable nicht dupliziert. –

+0

Welchen Browser benutzen Sie? Haben Sie FormData irgendwo anders in Ihrem Code definiert? – Musa

+0

Chrome - fügen Sie diese js-Datei ist riesig - nach 'FormData()' gesucht und es erscheint ein paar Mal, aber für andere Variablen an anderer Stelle definiert. Keine Methoden heißen, dass entweder –