0%

Http协议下载非ASCII文件名文件

参考链接

引子

在使用自建的OSS时,发现使用Safari下载中文名文件,文件名是乱码,如果在响应头中将文件名使用UTF-8进行URLEncode,又会直接拿到编码过后的文件名。研究之后发现其实还是HTTP的曲折发展史造成的问题。

RFC 5987

  • RFC 2068
  • RFC 2616
  • RFC 5987

HTTP 1.1协议历经三代发展,从最初的不支持非ASCII文件名到支持UTF-8,中间阶段不同的UA使用了不同的方式对非ASCII文件名进行了支持。最终由RFC 5987结束了这种混乱的局面。
最佳的解决方案如下:

1
2
//filename需要使用RFC 3986标准声明的“百分号URL编码”
Content-Disposition: attachment;filename="%e2%82%ac%20rates.txt"; filename*=utf-8''%e2%82%ac%20rates.txt

这种方式既兼容使用旧标准(RFC 2616)的IE,同时也兼容使用新标准(RFC 5987)的UA,完美的解决了多语言的问题(唯一的小瑕疵是需要有一个ASCII编码的后缀)。