- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
首先,我很确定这不是重复的,因为我已经在 StackOverflow 和其他地方研究这个主题很长时间了。类似的问题已经被问到,但没有一个得到令人满意的回答。
过去的相关(但不完全相同)问题:
我也完全了解 mod_rewrite
技巧 completely unnecessary处理 HTTP header 中的文件名。但让我们假设这不是一个选项。
大多数现代浏览器(IE9+、Firefox、Chrome)都支持 RFC2231/5987下载名称中包含非 ASCII 字符的文件时。在这些情况下,以下 PHP 代码就像一个魅力:
header("Content-Disposition: attachment; " .
"filename*=UTF-8''" . rawurlencode($filename));
IE <= 8 不理解 RFC2231/5987,但下面的代码大部分时间都有效。由于每个浏览器都试图在某种程度上模拟 IE,因此这也适用于许多其他浏览器,例如 Firefox。
header("Content-Disposition: attachment; " .
'filename="' . rawurlencode($filename) . '"');
同时,Chrome < 11 和 Safari < 6 似乎更喜欢以下内容,尽管它会将非 ASCII 字符直接放在标题中。
header("Content-Disposition: attachment; filename=" . $filename);
到目前为止一切顺利。
但是当涉及到 Android 的默认浏览器应用程序时,一切都会分崩离析。 (到目前为止,我已经在 Gingerbread 、 Ice Cream Sandwich 和果冻 bean 中对此进行了测试。)
如果你给它标准的 RFC2231/5987 处理,默认浏览器会完全忽略它并尝试从 URL 的最后部分猜测文件名。
如果你给它通常的非标准 (IE <= 8) 处理,默认浏览器要么试图将文件名解释为 ISO-8859-1,导致无法理解的字符困惑,要么它默默地丢弃所有非-ASCII 字符。确切的行为因版本而异,但无论如何很明显,Android 的默认浏览器也不支持 rawurlencode() 格式。
如果将原始文件名放在 header 中,也会发生同样的事情。
这通常不是第三方浏览器的问题,例如 Firefox for Android、Dolphin Browser 和 Boat Browser。默认浏览器应用程序是唯一始终无法理解 UTF-8 文件名的应用程序。
也许这最终在最新版本的 Android 中得到修复,或者可能会在下一个版本中得到修复。但这不是我的问题。我需要它在现有设备中工作,而且那里仍然有数百万个 Gingerbread 和 ICS 设备。
我阅读了错误报告,阅读了投诉,几乎阅读了有关此问题的所有内容。到目前为止,我一直无法找到任何实际有效的编码方案。
如果有人知道如何编码非 ASCII 文件名**(例如 файла파일ファイル名.jpg
)在 Content-Disposition
**header 并让Android默认浏览器识别,请分享!我不在乎它有多古怪或不标准。我不在乎它是否需要针对每个 Android 版本进行定制。
不幸的是,到目前为止我还没有收到任何真正解决上述问题的答案。所以赏金到期无人认领。请不要回答,除非您确实知道如何以 Android 浏览器在 ICS 之前识别的方式对非欧洲混合语言文件名进行编码,或者您有确凿证据证明这是不可能的。
最佳答案
URLUtil.java负责调用 parseContentDisposition
的 guessFileName
使用此正则表达式 "attachment;\\s*filename\\s*=\\s*(\"? )([^\"]*)\\1\\s*$"
。
根据 Content-Disposition header 获取文件的文件名。
下面的源代码试图复制 parseContentDisposition 功能,在我测试它时工作正常。例如,它返回 файла파일ファイル名.jpg。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HelloWorld{
public static void main(String []args){
String contentDisposition = "Content-Disposition: attachment; " + " filename=" +"\"файла파일ファイル名.jpg\"";
Pattern CONTENT_DISPOSITION_PATTERN = Pattern.compile("attachment;\\s*filename\\s*=\\s*(\"?)([^\"]*)\\1\\s*$",Pattern.CASE_INSENSITIVE);
try {
Matcher m = CONTENT_DISPOSITION_PATTERN.matcher(contentDisposition);
if (m.find()) {
System.out.println("Result: " + m.group(2));
}
} catch (IllegalStateException ex) {
// This function is defined as returning null when it can't parse the header
}
}
}
关于php - 有什么方法可以让 Android 的默认浏览器识别 "Content-Disposition: attachment"下载中的非 ASCII 文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22787697/
我收到此错误消息: .rvm/gems/ruby-2.5.1/bin/ruby_executable_hooks:24:in `' 我重新安装了 Ruby rvm reinstall ruby-2.5
我开始从事 WPF Ribbon 开发,非常好! 我的问题是找到(免费)基本图标(如文件保存/打开/等,剪切/粘贴/等)。 你有什么建议吗? 最佳答案 你看过Visual Studio Icon Li
我只找到经典的声音ID,但我需要Chord(默认)日历警报。如何播放声音? ks #define systemSoundID 1315 AudioServicesPlaySystemSound (s
在 Magento 中创建货件时,有一个复选框可让您“通过电子邮件发送货件副本”。 默认情况下未选中。有谁知道我需要编辑哪个文件才能默认设置为“选中”? 最佳答案 这是一个app/design/adm
我有一个简单的 IValueConverter,它只使用 TypeConverter 进行转换。但是,在某些情况下,提供的 TypeConverter 会失败。 如果转换器未提供 Binding,我想
我正在阅读教程,默认 Activity 是一个扩展另一个类的类,它所拥有的只是一个覆盖方法。应用程序如何工作,因为它不做任何其他事情?我很困惑! 最佳答案 父类 Activity 为您处理一切。 关于
我刚刚开始研究游戏框架。我正在尝试构建 rest api,并将 postgresql 用于我的数据库连接。这是我第一次同时使用 play 和 postgre。我在 build.sbt 中建立了一个数据
是否可以创建具有以下属性的 python 对象: class Foo: def __default_method__(x): return x f = Foo() f(10) > 10
我是 jQuery 的新手,遇到了一个烦人的问题。我有一些登录字段,当该字段为空时会填充默认文本,然后在单击时删除。 我的问题是,当用户保存了他们的用户名/密码(使用浏览器)时,如果他们返回页面,登录
考虑这个代码片段: void Foo(std::string str1, std::string str2) {} template void Bar() { Foo(Types{}...);
我正在编写一个简单的 C 程序,我应该用缓冲区溢出来攻击它。所以,我不想在编译时使用任何标志。如何消除使用的默认标志? # readelf -p .GCC.command.line stack Str
考虑这个代码片段: void Foo(std::string str1, std::string str2) {} template void Bar() { Foo(Types{}...);
我有以下代码[这是一道面试题]: #include #include using namespace std; class A{ public: A(){ cout co
我想在 Autofac 中为每个匹配的生命周期范围注册创建一个实例,但偶尔需要从全局容器(没有匹配的生命周期范围)请求一个实例。在不存在匹配生命周期范围的情况下,我想给出一个顶级实例而不是抛出异常。
我正在做一个收集单词共现的修改版本,所以我编写了自己的 javascript,我正在跟踪三个对象中的出现。但是,一旦对象变大(约 800 万、300 万和 172000),每 100000 个句子需要
我正在使用 pykalman 模块中的 KalmanFilter,我想知道它如何处理缺失的观察结果。根据文档: In real world systems, it is common to have
我有一个应用了 RenderTransform 的 Canvas ,如下所示: 谁能告诉我这些值是什么意思?我似乎无法找到用于解析这些值的转换器。 最佳答案 如 RenderTransform是 T
我是 Linux 的新手,现在使用 CentOS 6。我在这里使用 MySQL 工作台,每当我尝试添加新连接时,它都会询问我默认的 key 环密码。我真的不知道,这个密码是从哪里设置的,我之前没有设置
我在 Ubuntu 18.04 上工作。我没有定义 GL_GLEXT_PROTOTYPES .我使用 glXGetProcAddress 加载“核心”OpenGL 函数.我的申请链接到 /usr/li
我按照文档中的示例添加了对使用 asio 加载 HTTPS 站点的支持,这意味着我调用 ctx.set_default_verify_paths();使用系统默认路径来查找证书。 然而,我得到:una
我是一名优秀的程序员,十分优秀!