.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
相关产品推荐
相关产品推荐

