我有一个名为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();
bobince.. 8
所有名称在IE中都能正常工作,但名称中包含";" 要么 "#".
我不能用'#'重现问题但是';' 肯定会打破它.与'''和'\'一样(你可以在Unix上的文件名中使用它,这会破坏你的引号字符串).
在RFC1521中定义了在RFC822家族参数化标头中包含带外字符的"正确"解决方案,例如Content-Disposition :在'token'中不能包含的字符串应该包含在带引号的字符串中,RFC2822定义为"和\字符反斜杠转义,然后用引号括起来.
然后RFC2231以一种非常复杂的方式扩展它,在头参数中包含非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
这要求您使用普通URL编码和UTF-8的Unicode字符编码大多数标点符号,但至少可以获取字符.上面的结果是'Foo; Bar'的文件下载提示.
请注意,即使您可以在这样的URL路径部分中编码像Windows一样不友好的字符,但对于下载的文件,最好不要这样,因为IE会通过尝试使用文件名中的'"'来保存文件来做出响应,并将默默地和神秘地失败作为回应.
所有名称在IE中都能正常工作,但名称中包含";" 要么 "#".
我不能用'#'重现问题但是';' 肯定会打破它.与'''和'\'一样(你可以在Unix上的文件名中使用它,这会破坏你的引号字符串).
在RFC1521中定义了在RFC822家族参数化标头中包含带外字符的"正确"解决方案,例如Content-Disposition :在'token'中不能包含的字符串应该包含在带引号的字符串中,RFC2822定义为"和\字符反斜杠转义,然后用引号括起来.
然后RFC2231以一种非常复杂的方式扩展它,在头参数中包含非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
这要求您使用普通URL编码和UTF-8的Unicode字符编码大多数标点符号,但至少可以获取字符.上面的结果是'Foo; Bar'的文件下载提示.
请注意,即使您可以在这样的URL路径部分中编码像Windows一样不友好的字符,但对于下载的文件,最好不要这样,因为IE会通过尝试使用文件名中的'"'来保存文件来做出响应,并将默默地和神秘地失败作为回应.