2016-07-04 13 views
0

Ich habe ein Szenario, in dem ich den Dateistrom von Client-Seite hochladen möchte (ich verwende AngularJS), um die Web-API in asp.net über JSON-Objekt. Also gibt es einige Felder im JSON-Objekt, in denen ein Feld Dateistrom ist. Wie erstelle ich ein JSON-Objekt und sende es an die Web-API, die Modellbindung auf der API-Seite zu meinem Modell bekommen.Wie lade ich einen Dateistream in die Web-API 2 in ASP.NET über ein JSON-Objekt hoch?

$scope.fileUploadData = { 
     TextId: 304765, 
     DocumentId: 0, 
     PatientId: 166158, 
     file://This is my file stream property in JSON 
} 

    public ApiActionResult CreateDocument(DocumentVM model) 
{ 
    //Some logic here..... 
} 

// DocumentVM class will be as follows 
public class DocumentVM 
{ 
     long TextId; 
     long DocumentId; 
     long PatientId; 
     Stream file; 
} 

Bitte geben Sie mir die Beispielcode Schnipsel, wie Sie es erreichen.
Was ich versucht habe: Ich googelte viele, aber ich fand die Lösungen wie die Verwendung von mehrteiligen Formulardaten. In dem JSON und Datei-Stream angehängt und dann an die Web-API gesendet. Ich habe folgende Logik verwendet, um die mehrteiligen Formulardaten zu extrahieren.

public async Task<ApiActionResult> CreateDocument() 
{ 
    MultipartFormDataStreamProvider provider = 
      new MultipartFormDataStreamProvider(Path.GetTempPath()); 
      var result = await Request.Content.ReadAsMultipartAsync(provider); 
      var model= result.FormData["Metadata"]; 
      var fileData = result.FileData;//How it will retriev the file data 
} 
+0

Mit einfachen JSON-Objekt nicht kann Datei streamen. Sie müssen eine mehrteilige Anfrage erstellen. Auf der JavaScript-Seite müssen Sie das File-Objekt erstellen, das mit einer mehrteiligen Anfrage an den Server übergeben wird. – dhavalcengg

+0

Also gibt es keine andere Option als Multi-Form-Daten, um Stream an die API zu senden? –

Antwort

1

nicht wissen, ob Sie eine Lösung oder nicht für das Problem bekam ... aber ich hatte das gleiche Szenario und ich löste es wie unten

von Es gibt zwei Möglichkeiten, um die gleiche

tun

Ansatz 1: Verwendung MultipartFormData Stream direkt auf Ihrem WebAPI passieren, überprüfen Sie diese link

In Ihrer Frage haben Sie erwähnt, dass Sie diese approa versucht ch, aber nicht jeden Tag bekommen .. meine Vermutung ist, dass Sie enctype="multipart/form-data" in Ihrem HTML-Formular nicht verwendet haben.

Ansatz 2: Sie können einen benutzerdefinierten Modelbinder erstellen, die dann auf Modell eingerichtet werden können, wie Sie Aktion des unter

public class MyModelBinder : IModelBinder 
    { 
     public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
     { 
      // Extract the posted data from the request 
      // Convert the base64string to Stream 
      // Extract the model from the bindingcontext 
      // Assign the model's property with their values accordingly 
     } 
    } 

In Ihrem Controller

public ApiActionResult SaveDocument([ModelBinder(typeof(MyModelBinder))]DocumentVM contentDTO)