HttpClient的西里尔符号POST请求上传文件名
问题描述:
在我的一个.NET应用程序中,我已经通过HttpClient将文件上传到网站。这里是实施HttpClient的西里尔符号POST请求上传文件名
using (var clientHandler = new HttpClientHandler
{
CookieContainer = cookieContainer,
UseDefaultCredentials = true
})
{
using (var client = new HttpClient(clientHandler))
{
client.BaseAddress = requestAddress;
client.DefaultRequestHeaders.Accept.Clear();
using (var content = new MultipartFormDataContent())
{
var streamContent = new StreamContent(new MemoryStream(fileData));
streamContent.Headers.ContentDisposition = ContentDispositionHeaderValue.Parse("form-data");
streamContent.Headers.ContentDisposition.Parameters.Add(new NameValueHeaderValue("name", "contentFile"));
streamContent.Headers.ContentDisposition.Parameters.Add(new NameValueHeaderValue("filename", "\"" + fileName + "\""));
streamContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
content.Add(streamContent);
HttpResponseMessage response = await client.PostAsync("/Files/UploadFile", content);
if (response.IsSuccessStatusCode)
{
return true;
}
return false;
}
}
}
方法工作正常。但是当我通过西里尔文符号在文件名属性生成后请求文件名已损坏符号如???? 1.docx为exmaple其中?取代西里尔文符号。有没有任何方法可以发送西里尔文符号而不会发生讹误?
答
我相信filename
是非常有限的,你可以在代码页方面做什么。我想它只支持ASCII(不是100%肯定)。有一个更好的头,你可以使用称为filename*
这是有点难以谷歌谷歌将只是删除*
和你得到所有普通filename
回来。
长话短说,你需要使用:
$"filename*=UTF-8''{fileName}"
您可能还需要做文件名的一些编码关于空间等可以在Google多一点对+检查这个SO post 。
P.S.一些旧的浏览器可能不喜欢它,你需要检查你的需求。
可能是[this]的副本(https://*.com/questions/19196258/url-cyrillic-encoding-issue-with-webbrowser-control) – user5226582