You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#调用API上传非拉丁文件名文件乱码问题求助

这个问题我之前也碰到过!核心原因是早期HTTP的multipart/form-data规范对非ASCII文件名的处理没有统一标准,默认的HttpClient在添加文件时,可能用了ISO-8859-1这类不兼容的编码生成filename参数,导致服务器端解析出乱码。

解决办法是手动按照RFC 5987标准设置Content-Disposition头的filename*参数——这是专门为非ASCII文件名定义的规范,现代服务器基本都支持。

下面是修改后的完整代码示例,替换你原来的文件上传部分:

// 假设myfile是你的文件对象(比如IFormFile或者FileStream)
string originalFileName = myfile.FileName;
var streamContent = new StreamContent(myfile.OpenReadStream());

// 按照RFC 5987标准编码非ASCII文件名
string encodedFileName = Uri.EscapeDataString(originalFileName);
streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
    Name = "\"file\"", // 必须加双引号,避免文件名含特殊字符时解析失败
    FileName = $"\"{originalFileName}\"", // 可选:兼容不支持filename*的旧服务器
    FileNameStar = $"UTF-8''{encodedFileName}" // 关键:UTF-8编码的标准格式
};

// 可选:设置文件的Content-Type,保持和原文件一致
streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(myfile.ContentType);

var multipartContent = new MultipartFormDataContent();
multipartContent.Add(streamContent);

var client = new HttpClient();
var response = await client.PostAsync("urlToPost", multipartContent);

关键细节说明:

  • FileNameStar:这个参数是RFC 5987规定的,格式为[编码]''[编码后的文件名],这里用UTF-8编码,所以是UTF-8''加上Uri.EscapeDataString处理后的文件名(它会正确转义所有非ASCII和特殊字符)。
  • 双引号包裹:Name和FileName的值必须用双引号括起来,否则如果文件名里有空格、逗号等特殊字符,服务器端会解析错误。
  • 兼容性:保留FileName参数是为了兼容那些还不支持filename*的旧服务器,现代服务器会优先读取filename*的值,所以不会影响正常解析。

为什么你之前用UTF8Encoding没效果?因为默认的MultipartFormDataContent.Add方法并没有用这个编码生成filename*参数,只是可能在流内容里用了UTF-8,但文件名本身的头信息还是用了不兼容的编码。手动设置Content-Disposition头才是正确的解决路径。

内容的提问来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:26:56