Tomcat 7迁移至Tomcat 8.5后无法下载excel、image等二进制文件问题
Tomcat 8.5 二进制静态文件返回text/html乱码解决方案
该问题由Tomcat 8.5与7版本的默认配置差异导致,可按以下顺序排查修复:
1. 校验应用级mime类型配置
Tomcat 8.5优先读取应用WEB-INF/web.xml中的mime映射规则,若应用内部配置覆盖了全局conf/web.xml的正确规则,就会出现类型识别错误。
- 打开应用
WEB-INF/web.xml,检查是否存在*.xls、*.png等二进制文件后缀的错误mime映射,如果有映射为text/html的配置直接删除,或者改为正确配置:
<mime-mapping> <extension>xls</extension> <mime-type>application/vnd.ms-excel</mime-type> </mime-mapping> <mime-mapping> <extension>xlsx</extension> <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type> </mime-mapping>
2. 调整DefaultServlet默认配置
Tomcat 8.5负责处理静态资源的DefaultServlet默认参数有变化,若未匹配到mime规则时默认返回text/html类型。你可以修改全局conf/web.xml中DefaultServlet的配置:
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>contentTypeDefault</param-name> <param-value>application/octet-stream</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
将未识别类型的默认返回值改为application/octet-stream,会直接触发二进制文件下载,不会被浏览器当做文本解析出现乱码。
3. 排查应用过滤器/拦截器逻辑
Tomcat 8.5的过滤器执行顺序和7存在差异,如果你部署的应用有全局编码过滤器、权限拦截器,可能存在误修改静态资源响应头的逻辑,强行给所有响应设置了Content-Type: text/html;charset=UTF-8。
- 给过滤器添加静态资源白名单,跳过
*.xls、*.jpg、*.png等二进制文件的处理 - 调整过滤器中全局设置响应contentType的逻辑,仅对动态接口生效
4. 调整静态资源存放路径
Tomcat 8.5对WEB-INF、META-INF目录的访问权限做了收紧,如果你的可公开访问的静态资源存放在这两个目录下,可能会被动态Servlet拦截处理导致返回类型错误,建议把这类资源移到应用根目录下的独立静态资源文件夹中。
完成以上调整后重启Tomcat,使用curl -s -I http://xx.yy.zz.pp:8080/testsite/bin/test.xls验证返回的Content-Type是否符合预期即可。
内容的提问来源于stack exchange,提问作者Sudeshna Bhattacharya
相关产品推荐
相关产品推荐

