【问题标题】:Workaround for file names with non-ascii characters on Android Chrome browser?Android Chrome 浏览器上带有非 ASCII 字符的文件名的解决方法?
【发布时间】:2013-07-03 01:04:34
【问题描述】:

我在这个问题上发布了一个类似的主题,但这更多是为了发现而不是综合解决方案。毫无疑问,我发现 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 服务器: Microsoft-IIS/7.5 X-AspNetMvc-版本:4.0 内容处置:附件; filename=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”。所以,看起来谷歌可能不会很快解决这个问题......

【问题讨论】:

    标签: android google-chrome utf-8 httpresponse content-disposition


    【解决方案1】:

    这确实是现有 Android 浏览器和 Android 中的 Chrome 中的一个错误。至少对于后者,应该报告一个错误。

    【讨论】:

    • 感谢您对此的确认。但是,Android Chrome 浏览器似乎确实接受未使用 utf-8 编码的非 ascii 字符。所以现在,我只是不打算为这个特定的浏览器进行编码。如果 Google 决定“修复”这个问题,我将不得不再次更改代码。
    • 理想情况下,网站不需要嗅探用户代理。所以谷歌真的需要解决这个问题。
    【解决方案2】:

    事实证明,对于 Android Chrome 浏览器,文件名不需要为非 ascii 字符进行 UTF-8 编码。我能够使用 Android Chrome 成功下载包含韩语字符的文件,而无需使用 UTF-8 对其进行编码。我必须做更多的测试才能 100% 确认这一点。

    【讨论】:

    • 将未转义的非 ASCII 字符放在那里无法互操作。
    • 此修复对所有相关人员都有效。答案是不为 Android Chrome 浏览器使用 utf-8 编码。非 ascii 字符只要未编码就可以工作。
    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2017-05-23
    • 2023-04-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多