我已经在这个问题上发布了一个类似的主题,但这更多是为了发现而不是综合解决方案。毫无疑问,我发现 Android Chrome 浏览器无法处理 CONTENT-DISPOSITION httpResponse 标头中文件名中的 UTF-8 编码。这是我的示例 httpResponse 标头: HTTP/1.1 200 OK Cache-Control: private, s-maxage=0 Content-Length: 54295903 Content-Type: application/octet-stream Server: Microsoft-IIS/7.5 X-AspNetMvc-Version: 4.0 Content-Disposition:附件;文件名=UTF-8''MyVideo.MOV X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Sat, 29 Jun 2013 05:01:32 GMT
这是我用来对文件名进行编码的 C# .NET 代码:
// 这是 RFC5987 格式,指定使用 utf-8。撇号必须为 Chrome 编码。contentDisposition = "附件;文件名*=UTF-8''" + Uri.EscapeDataString(fileName).Replace("'", Uri.HexEscape('\''));
我在 Nexus 7 设备上进行测试,Firefox 和 Dolphin 浏览器能够正确处理 UTF-8 编码。我在一家国际公司工作,因此文件名必须能够包含非 ascii 字符。我已经包含了背景信息以及问题。“下载”属性不会覆盖文件名,因为 url 没有物理指向文件。我正在使用 mvc 路由,所以下载属性被忽略(使用 content-disposition 中的文件名)。有人知道可能的解决方法吗?是否可以以某种方式使用 utf-8 对 Android Chrome 的文件名进行编码,然后覆盖更改后的“Download.bin”文件名,以便使用正确的名称下载?
背景信息:Web 服务器是 Windows Azure 云上的 IIS 7.5。使用的 Web 应用程序是 Microsoft 用于路由的 MVC 框架。So when a file is selected to download from the Chrome browser within an Android device, a download method on the server is accessed using MS MVC routing. 在此方法中,我们使用 httpResponse 指定标题信息和流式传输文件的碎片。这适用于 Android 设备上的任何其他浏览器应用程序(例如 Firefox 和 Dolphin),并且能够使用正确的文件名和类型进行保存。但是,对于 Chrome,文件和类型(有时)会被重命名。
问题:Android Chrome 浏览器在所有情况下都会将文件重命名为“下载”。在某些情况下,它会将类型重命名为“.bin”(例如,如果扩展名为 .MOV)。正如我之前提到的,同一 Android 设备上的 Firefox 和 Dolphin 浏览器应用程序不会出现这种行为。文件已正确下载。作为旁注,我已经尝试在 Anchor 元素中指定“下载”属性,但没有成功。在这种情况下,即使是 Android Chrome 浏览器也会忽略“下载”属性。我的直觉是,由于我们流式传输文件或 MVC 路由的方式,“下载”属性被忽略了。另外需要注意的是,桌面版 Chrome 浏览器下载文件时没有问题(没有重命名)。
我将不胜感激任何帮助。
注意:我尝试了最新的 Android Chrome 测试版,文件名中的 utf-8 编码在该浏览器上也不起作用。该文件被重命名为“Download”或“Download.bin”。所以,看起来谷歌可能不会很快解决这个问题......