文章目录
- 前言
- 代码片段如下:
- 一、问题分析
- 二、解决办法
- 总结
前言
在开发过程中遇到的一个小问题,实现一个下载模板的接口,我选择了使用hutool包的ServletUtil.write方法去进行文件下载,但调试过程中下载出来的文件名是乱码的,那么是为什么呢?
代码片段如下:
一、问题分析
- 我们先来看看ServletUtil.write方法的源码
- 我们发现他会去调用getMimeType方法去分析MIME 类型,如果获取不到就会设置默认的响应MIME类型,也就是application/octet-stream
- 我们发现他是通过拿文件的后缀名从而返回相应的MIME类型到这里我们发现还是很正常的,最起码响应的MIME类型是没问题的我们接着往下看,getInputStream没什么好看的,就是获取输入流那么重点就是看write方法了
一般出现文件名中文乱码我们都会想到响应设置字符编码没设置为UTF-8
,那么很明显的看到,他设置的响应字符编码是通过我们响应设置的编码来使用的,也就是response.getCharacterEncoding()
,如果他获取为null
,那么他就设置默认值为UTF-8
,而传输过程他也给我们使用了URLUtil.encodeAll
给我们进行编码了,很明显这里不会有问题,那这时经过debuger就发现了,原来是因为response.getCharacterEncoding()
获取到的编码为iso-8859-1
编码,所以下载出来的文件名乱码了,那么解决的办法也很简单,只需要手动设置一下编码就好了
二、解决办法
总结
- 本文简单讲述了使用ServletUtil.write方法下载接口文件中文乱码问题的原因以及如何解决,通过查看ServletUtil.write方法的源码进一步了解底层思路。
- 欢迎大家提出建议以及批评,有任何问题可以私信。