我有一个名为 AttachmentDownload.aspx 的文件,并且 Page_Load 方法内部有这样的代码,可以提供下载文件。除包含“;”的名称外,所有名称均可在 IE 中正常工作。或者 ”#”。他们允许用户以“AttachmentDownload.aspx”名称保存文件。有解决方法吗?
这是一个例子:
var fileName = Server.UrlPathEncode (";%.txt");
Response.AddHeader("content-disposition", String.Format("attachment;filename=\"{0}\"", fileName));
Response.WriteFile(path);
Response.End();
除包含“;”的名称外,所有名称均可在 IE 中正常工作。或者 ”#”。
我无法用“#”重现问题,但“;”肯定会破坏它。 '"' 和 '\' 也是如此(你可以在 Unix 上的文件名中使用它们,这会破坏你的引用字符串)。
在 RFC822 系列参数化标头(例如 Content-Disposition)中包含带外字符的“正确”解决方案定义在RFC1521 http://www.ietf.org/rfc/rfc1521.txt:不能包含在‘token’中的字符串应该用引号括起来,这RFC2822 http://www.ietf.org/rfc/rfc2822.txt定义为将 " 和 \ 字符反斜杠转义,然后用引号引起来。
RFC2231 http://www.ietf.org/rfc/rfc2231.txt然后用一种非常复杂的方式扩展它,在标头参数中包含非 ASCII 字符,理论上您会希望使用它来支持 Unicode 字符。
实际上:HTTP 并不是真正的 RFC822 系列规范,并且这些内容在常规浏览器中都不起作用(除了 Opera 中的反斜杠转义符)。没有可靠的方法来向客户端获取 Unicode Content-Disposition 文件名,并且“;”的问题不是因为任何转义问题,而只是因为 IE 无法解析太妃糖的参数化标头(它在字符串中的下一个分号,即使它被引号包围)。
为了实现可靠的跨浏览器文件名设置,您可以在现实世界中采取两种方法:
在将文件名放入 Content-Disposition 标头之前,先删除文件名中的任何攻击性内容。这包括前导/尾随空格/点、大多数其他标点符号和任何非 ASCII 的内容。
-
根本不要在 Content-Disposition 标头中指定文件名,让浏览器从 URL 的最后部分确定要使用的文件名。要阻止它选择“AttachmentDownload.aspx”,您可以将任何您喜欢的内容作为尾随 URL 部分,例如:
http://www.example.com/AttachmentDownload.aspx/Foo%23Bar http://www.example.com/AttachmentDownload.aspx/Foo%23Bar
这要求您使用纯 URL 编码和 UTF-8 的 Unicode 字符对大多数标点符号进行编码,但至少您可以获取字符。上面的结果会出现“Foo;Bar”的文件下载提示。
请注意,即使您can像这样在 URL 路径部分中编码像 '"' 这样的 Windows 不友好字符,对于下载的文件最好不要这样做,因为 IE 会通过尝试在文件名中使用 '"' 来保存文件来响应,并且会默默地、神秘地响应失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)