如何使用HttpClient上传文件数组?

问题描述:

如何使用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

要正确地将多个文件上传到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; 
     } 

只需将文件直接添加到内容中就可以正常工作(假设您给出了正确的名称)。