2017-08-13 21 views
0

HttpClientを使用してこのAPIに複数のファイルをアップロードする方法https://support.crowdin.com/api/add-file/? ファイルの配列を含むという名前のポストパラメータが必要です。HttpClientを使用してファイルの配列をアップロードするには?

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

は、残念ながら、私は

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

を得続ける結局私は、しかしRestSharpとのHttpClientは完全に異なるAPIを持ち、RestSharpと同じことをしたいです。

+0

httpベースのクライアントであれば、この質問を何度も繰り返し聞かれますか? –

+0

@SirRufoいいえもう一度質問しませんが、2つのクラスには異なるAPIがあり、別の方法で動作します。したがって、このソリューションは間違いなく異なるでしょう。私はあなたを怒らせることを意味しませんでした。 – riki

+0

それは別のコードなので、重複しているとは思わない。 – Aminadav

答えて

1

crowdinに複数のファイルを正しくアップロードするには、複数のことがあります。

Content-Disposition:NameとFileNameを設定する必要があります。

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

コンテンツに直接ファイルを追加するだけで、正常に機能します(正しい名前を指定した場合)。

関連する問題