我遇到文件下载问题,下载正在用下划线替换所有空格。
基本上我在这里遇到问题:
Response.AddHeader("Content-Disposition",
"attachment; filename=" + someFileName);
问题是如果someFileName中有一个空格,例如“check this out.txt”,则会提示用户下载“check_this_out.txt”。
我认为最好的选择是UrlEncode文件名,所以我试过
HttpUtility.UrlEncode(someFileName);
但它正在用加号替换空格,这让我很难过。那么我就试过了
HttpUtility.UrlEncode(HttpUtility.UrlDecode("%20"))
并且解码工作正常并给了我一个空间,但是编码占用了空间,然后再次给我加号。
我在这里缺少什么,这是正确的吗?如果是这样,我应该如何正确地将空格编码为%20,这就是我需要的。
答案 0 :(得分:16)
基本上,%20和+都是编码空间的有效方法。显然,UrlEncode方法必须选择一个选项...如果它选择以其他方式执行,其他人会问为什么UrlEncode(UrlDecode("+"))
返回“%20”... < / p>
您可以随时对其进行编码,然后在“+”上为“%20”执行直接字符串替换。我认为会起作用......
答案 1 :(得分:9)
我认为最好的选择是UrlEncode文件名
这不是在带标题参数(如Content-Disposition-filename)中放置带外字符的正确方法,并且由于某个错误只能在IE中工作(有时)。实际上这是一个长期存在的问题:there is no right way。
如果您需要在下载的文件名中放入特殊字符,则无法使用Content-Disposition-filename可靠地执行此操作。相反,省略Content-Disposition-attachment标头中的'filename'参数,并将所需的文件名保留在URL的尾部。如果没有文件名参数,浏览器将从URL路径获取它,其中URL编码 是解决特殊字符的正确方法。
答案 2 :(得分:6)
我自己也遇到过这种情况。如果你 能够将空格更改为%20s 然后IE7将正确转换它们。 Firefox虽然会采取它们 从字面上看(至少在使用时 Content-disposition header)所以你 将需要为来自的请求执行此操作 仅限IE7。
我们在应用中执行了以下操作。 ( 一个 基于tomcat的文档存储库)
String userAgent = request.getHeader("User-Agent"); if (userAgent.contains("MSIE 7.0")) { filename = filename.replace(" ", "%20"); } response.addHeader("Content-disposition", "attachment;filename=\"" + filename + "\"");
答案 3 :(得分:2)
嗨我在下载包含空格的文件时也遇到了同样的问题。
请查看最佳套房的链接并给出完整的答案。
http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download
为了便于理解我只是添加ASP.net代码如何解决这个问题。
string document = @"C:\Documents and Settings\Gopal.Ampolu\My Documents\Downloads\" + "Disciplinary & Grievance Procedures..doc";
string filename = "Disciplinary & Grievance Procedures..doc";
Response.ContentType = mimeType;
Response.AddHeader("Content-Disposition", @"attachment; filename=""" + HttpUtility.UrlDecode(filename) + @"""");
Response.Flush();
从上面你可以看到,在为响应添加标题时,文件名用双引号括起来。 请确保“文件名”必须使用UrlDecode解码。
答案 4 :(得分:1)
还有一个选项,如果您可以通过以下方式获得有关Windows修补程序更新的客户:
Windows Hotfix Update for IE white space issue
它是客户端,因此可能不适用于所有方案,但如果可行,仍然是一个选项。