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

.NET中ContentDisposition为何错误编码特定文件名?

为什么特定文件名会让ContentDisposition生成带换行的编码结果?

这是个极其罕见的问题——在一万多个提交的文件名里只出现过一次。当用以下代码生成ContentDisposition时,会得到包含换行符的无效结果:

var fileName = "AAA_AAAAAAAAA AAAAA (AAAA – AAAA &  – )";
var cd = new ContentDisposition{
    FileName = fileName
};  

Console.WriteLine(cd.ToString());

注意:文件名中的短横线是n-dash(U+2013),不是普通的ASCII连字符。

生成的结果被拆成了两行:

attachment; filename="=?utf-8?B?QUFBX0FBQUFBQUFBQSBBQUFBQSAoQUFBQSDigJMgQUFBQSAmICDigJMg?=
 =?utf-8?B?KQ==?="

更奇怪的是,只要修改这个文件名里的任意字符(比如删掉第一个A),输出就会变成正常的单行格式:

attachment; filename="=?utf-8?B?QUFfQUFBQUFBQUFBIEFBQUFBIChBQUFBIOKAkyBBQUFBICYgIOKAkyAp?="

问题原因

这是.NET框架处理RFC 2047编码的规则导致的:

  • ContentDisposition.ToString()在对非ASCII文件名进行Base64编码时,会遵循MIME规范的行宽限制——默认每76个字符就插入换行符拆分。
  • 你的这个文件名编码后的Base64字符串,刚好卡在了触发换行的分界点:第一部分编码内容长度刚好到76字符,框架自动插入换行,把剩余的短内容拆到下一行。
  • 修改任意字符后,编码后的字符串长度或分段位置发生变化,不再触发换行逻辑,因此输出单行有效结果。

而Azure文件存储的标签系统不允许值中包含换行符,所以这种多行格式会直接引发错误。

解决办法

可以手动移除ToString()结果中的换行符,确保输出为单行:

var fileName = "AAA_AAAAAAAAA AAAAA (AAAA – AAAA &  – )";
var cd = new ContentDisposition{ FileName = fileName };
// 清除所有换行符
var validCdString = cd.ToString().Replace("\r\n", "").Replace("\n", "").Replace("\r", "");
Console.WriteLine(validCdString);

处理后的字符串就能正常作为Azure文件存储的标签使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:07:05