2016-07-25 6 views
0

bekommen kann ich AngularJS bin mit jemandem zu erlauben, eine Datei auf meiner Web-Service zu schreiben, die # verwendet c WebAPI 2.Posting Dateien WebApi2 AngularJS mit - nicht Dateinamen oder Header

 self.AddDocument = function() { 
 
      var f = document.getElementById('documentFile').files[0]; 
 
      var r = new FileReader(); 
 

 
      r.onloadend = function(e) { 
 
      var data = e.target.result; 
 
      console.log('AddDocument data' + data); 
 

 
      var fd = new FormData(); 
 
      fd.append('Attachment', f); 
 

 
      $http.post('api/Document/' + $routeParams.changeId + '/AddDocument', 
 
       fd, { 
 
       method: 'POST', 
 
       url: 'api/Document/' + $routeParams.changeId + '/AddDocument', 
 
       data: fd, 
 
       // I have tried application/x-www-form-urlencoded & application/octet-stream for the content type 
 
       headers: { 
 
        'Content-Type': 'application/x-www-form-urlencoded' 
 
       } 
 
       }).then(function(response) { 
 
       console.log(response.data); 
 
      }); 
 
      }; 
 

 
      r.readAsArrayBuffer(f); 
 
     }; 
 
     }

Dieser Code funktioniert gut, soweit ich sagen kann, dass ich eine HttpRequestMessage in meinem Code durchkommen (siehe unten), aber es gibt keine Header, die durchlaufen werden - aber ich kann die Content-Disposition sehen, wenn ich ReadAsStringAsync

[HttpPost] 
[Route("api/Document/{id}/AddDocument")] 
public async Task<string> Add(HttpRequestMessage request) 
{ 
    var doc = await request.Content.ReadAsByteArrayAsync(); 

    var values = Enumerable.Empty<string>(); 

    // this is always null 
    var header = (request.Content.Headers.TryGetValues(name: "filename", values: out values)) 
     ? values.First() 
     : null; 

    // this will be the following 
    /* 
    * ------WebKitFormBoundaryQIUoHBmcWJTY9cJx 
Content-Disposition: form-data; name="Attachment"; filename="IMG_8639.JPG" 
Content-Type: image/jpeg 
    */ 
    var str = await request.Content.ReadAsStringAsync(); 

    // code that will add the byte array, filename, etc to a database table... 

    return "success"; 
} 

Wie ziehe ich den Dateinamen aus einer hochgeladenen Datei?

Antwort

0

Aus dem ersten Teil Ihres Code-Codes, was Sie tun, versucht, ein http-Anfrage-Objekt zu imitieren und das zu Ihrer Web-API. Dann versucht das Web-API in Ihrem Web-APi-Stack das Objekt, das Sie an das eingebaute Objekt HttpRequestMessage gesendet haben, zuzuordnen.

public async Task<string> Add(HttpRequestMessage request) 

entspricht:

public async Task<string> Add(FormData) 

Der HttpRequestMessage Parameter automatisch so gebunden ist, dass Sie halten Anforderungsinformationen in Ihrem Controller-Methode erhalten, wenn Sie auf

brauchen denke ich, was sollte man Wenn Sie ein Model-Objekt in C# (WEB API) erstellen, das direkt Ihrem FormData-Objekt zugeordnet ist, dann bindet der API-Stack es korrekt. Sie können die Header in der Hauptanfrage $ http.Post übergeben und sie im Web-API-Controller lesen .

Hoffe das macht Sinn, ich postete den ganzen Code, wie ich denke, das Problem hier ist das Verständnis des Konzepts. Als Beispiel überprüfen Sie diese Git Hub Sample, Sie können es immer an Ihre Bedürfnisse anpassen

Verwandte Themen