2017-08-13 3 views
0

Wie kann ich mehrere Dateien auf diese API https://support.crowdin.com/api/add-file/ mit dem HttpClient hochladen? Erwartet wird ein Post-Parameter namens files, der ein Array von Dateien enthält.Wie lade ich ein Array von Dateien mit HttpClient hoch?

HttpClient client = new HttpClient(); 
using (var content = new MultipartFormDataContent()) 
     { 
      var files = new MultipartContent("files"); 

      var fileContent = new StreamContent(fileStream); 
      fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { FileName = "test.locale.pot" }; 
      fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/pot"); 
      files.Add(fileContent); 

      content.Add(files); 

      content.Add(new StringContent("gettext"), "type"); 

      var statusResult = client.PostAsync(addUrl, content).Result; 
      var statusString = statusResult.Content.ReadAsStringAsync().Result; 
     } 

Leider halte ich

{ 
    "success":false, 
    "error":{ 
    "code":4, 
    "message":"No files specified in request" 
    } 
} 

Schließlich bekomme ich eine ganz andere API, die gleiche Sache mit RestSharp jedoch RestSharp und Httpclient zu tun haben wollen.

+0

Werden Sie diese Frage immer wieder für jeden http-basierten Client stellen, den Sie finden werden? –

+0

@SirRufo Nein, ich werde es nicht nochmal fragen, die beiden Klassen haben eine andere API und arbeiten auf andere Weise. Die Lösung wird also definitiv anders sein. Ich wollte dich nicht aufregen. – riki

+0

Es ist ein anderer Code, also glaube ich nicht, dass es ein Duplikat ist. – Aminadav

Antwort

1

Es gibt mehrere Dinge, die man tun muss, um mehrere Dateien korrekt zu crowdin hochzuladen.

Sie müssen Content-Disposition festlegen: Name und Dateiname.

 using (var content = new MultipartFormDataContent()) 
     { 
      var fileNameOnly = Path.GetFileName(fileName); 
      var fileContent = new StreamContent(File.OpenRead(fileName)); 
      fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") 
      { 
       Name = $"files[{fileNameOnly}]", 
       FileName = fileNameOnly 
      }; 
      fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/pot"); // "gettext" POT format 

      content.Add(fileContent, $"files[{fileNameOnly}]"); 

      content.Add(new StringContent("gettext"), "type"); 


      var statusResult = client.PostAsync(addUrl, content).Result; 
      var statusString = statusResult.Content.ReadAsStringAsync().Result; 
     } 

Das einfache Hinzufügen der Datei direkt zum Inhalt funktioniert gut (vorausgesetzt, Sie geben ihm den richtigen Namen).

Verwandte Themen