2017-08-13 292 views
0

如何使用HttpClient將多個文件上傳到此API?https://support.crowdin.com/api/add-file/? 它期望一個名爲files的發佈參數,其中包含一組文件。如何使用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同樣的事情,但是RestSharp和HttpClient的擁有完全不同的API。

+0

對於任何基於http的客戶端,你會一再問這個問題嗎? –

+0

@SirRufo不,我不會再問了,這兩個班有不同的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; 
     } 

只需將文件直接添加到內容中就可以正常工作(假設您給出了正確的名稱)。