SpringBoot ReponseEntity在手机浏览器下载文件遇到的兼容性问题

560 阅读2分钟

UC浏览器android端遇到文件名重复的问题

HttpHeader header = new HttpHeader();
header.add("Content-Disposition","attachment;filename=name;filename*=utf-8''" + name)

上述代码是为了解决中文乱码的问题,但没想到导致了UC浏览器的下载文件名问题,这里解决这个问题,只需要去掉;filename*=utf-8''" + name即可,UC浏览器无需此判断

中文名过长导致文件名乱码或者文件名被截取的问题

这是因为在获取文件名的时候,是通过UrlEncode.encode("utf-8")进行编码的,一个中文对应9个字节,而在某些浏览器中对于文件名的字符长度有限制,此时就不能通过utf-8进行。

String fileName = new String(name.getBytes("gb2312"),Charset.forName("iso88591"))

这里我们可以通过将中文通过gb2312编码,并最终通过浏览器默认的iso88591进行输出,众所周知,iso88591编码包含了gb2312编码,而在gb2312编码中,一个汉字占两个字节,所以最多可以有155/2=77个汉字大多数情况下,满足我们的需求。

safari浏览器默认打开没有下载

HttpHeader header = new HttpHeader();
header.add("content-type","application/octet-stream")

在设置Content-Type为特定的时候,会导致safari浏览器默认下载,这里对ContentType设置为application/octet-stream.

百度浏览器下载文件后缀名为.*

原因,百度浏览器不支持Content-Type为application/octet-stream,对于特定格式的文件需要指定特定的Content-Type

todo,暂未解决 微信默认浏览器下载,企业微信默认浏览器下载,qq默认浏览器下载,以及百度浏览器安卓浏览器下载文件自动下载登录页的问题