当前位置:  开发笔记 > 后端 > 正文

用";"下载文件 或文件名中的"#"废墟文件名

如何解决《用";"下载文件或文件名中的"#"废墟文件名》经验,为你挑选了1个好方法。

我有一个名为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会通过尝试使用文件名中的'"'来保存文件来做出响应,并将默默地和神秘地失败作为回应.



1> bobince..:

所有名称在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会通过尝试使用文件名中的'"'来保存文件来做出响应,并将默默地和神秘地失败作为回应.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有