如何使用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。
答
要正确地将多个文件上传到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;
}
只需将文件直接添加到内容中就可以正常工作(假设您给出了正确的名称)。
对于任何基于http的客户端,你会一再问这个问题吗? –
@SirRufo不,我不会再问了,这两个班有不同的API并以不同的方式工作。所以解决方案肯定会有所不同。我不是故意让你不高兴。 – riki
这是一个不同的代码,所以我不认为它是重复的。 – Aminadav