【问题标题】:How to upload an array of files using HttpClient? [duplicate]如何使用 HttpClient 上传文件数组? [复制]
【发布时间】:2017-08-13 23:23:22
【问题描述】:

如何使用 HttpClient 将多个文件上传到此 api https://support.crowdin.com/api/add-file/? 它需要一个名为 files 的 post 参数,其中包含一个文件数组。

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。

【问题讨论】:

  • 你会为你会发现的任何基于http的客户端一次又一次地问这个问题吗?
  • @SirRufo 不,我不会再问了,这两个类有不同的 API 并且以不同的方式工作。所以解决方案肯定会有所不同。我不是故意让你难过的。
  • 这是一个不同的代码,所以我不认为它是重复的。

标签: c# post file-upload httpclient


【解决方案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;
        }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多