JSP下载中文名乱码问题
程序员文章站
2022-05-17 11:08:45
...
上传下载功能,几乎是一个Web应用中必不可少的功能,下载来说,通常我们有两种方式来实现,第一种直接使用超链接的方式连接到一个文件地址进行下载,但是如果txt的格式的话,则会直接打开在页面上,有点不符合下载的意思,其他的还好,最好整成一个压缩包的方式进行下载,第二种的方式使用JAVA的流下载,这种方式比较通用,一般基于一些WEB层框架如Struts,Spirng MVC实质上也是封装了流。
散仙写本篇博客的目的,就是记录下使用流下载期间遇到的一系列小问题,比如说,下载的中文名乱码,各个浏览器之间的不兼容,以及下载文件过大报内存溢出的异常等等,方便日后搞这方面的时候,少绕些弯子。
首先,先来看第一个问题,关于乱码的问题,这个问题其实还是很好解决的,主要有两步,第一在你的web容器里设置URL编码,比如散仙用的tomcat,设置编码为UTF-8即可。
第二步需要在你流返回的时候设置字符编码即可。
接下来,我们看第二个问题,各个浏览器下载的文件名不一致,还有部分乱码问题,这是由于浏览器的兼容性问题造成的,所以我们单独对IE的浏览器做下处理,然后火狐与谷歌等其他大部分浏览器为一套,代码如下:
判断是否为,IE浏览器的代码:
下载各种文件的核心代码:
接下来,我们来看第三个问题,下载的时候由于文件比较大,然后会报内存溢出的异常。
这种问题,一般也有两种解决方法,第一种切分大文件采用分而治之的方法下载,然后在下载的使用java.zip包里的工具类,进行压缩传输即可。第二种的就是调大JVM的内存和tomcat的内存,一般在正式的环境里服务器的配置应该会比较大,所以采取这种方法也是一种不错的方法。
至此,我们可以正常的进行下载了。
下载txt的文件:
散仙写本篇博客的目的,就是记录下使用流下载期间遇到的一系列小问题,比如说,下载的中文名乱码,各个浏览器之间的不兼容,以及下载文件过大报内存溢出的异常等等,方便日后搞这方面的时候,少绕些弯子。
首先,先来看第一个问题,关于乱码的问题,这个问题其实还是很好解决的,主要有两步,第一在你的web容器里设置URL编码,比如散仙用的tomcat,设置编码为UTF-8即可。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
第二步需要在你流返回的时候设置字符编码即可。
接下来,我们看第二个问题,各个浏览器下载的文件名不一致,还有部分乱码问题,这是由于浏览器的兼容性问题造成的,所以我们单独对IE的浏览器做下处理,然后火狐与谷歌等其他大部分浏览器为一套,代码如下:
判断是否为,IE浏览器的代码:
/** * 判断是否为IE浏览器 * */ public static boolean isIE(){ return ServletActionContext.getRequest().getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 ? true : false; }
下载各种文件的核心代码:
/** * 提供文件下载的方法 * * **/ public void downloadFile(){ HttpServletResponse response = ServletActionContext.getResponse(); try { String fileFullName = "D:/mydata/" + downLoadName; System.out.println(fileFullName); response.setCharacterEncoding("utf-8"); response.reset(); response.setContentType("text/plain;charset=utf-8");//文本格式 if(isIE()){ //处理IE 的头部信息 response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileFullName.substring(fileFullName .lastIndexOf("/")+1),Charsets.UTF_8.toString())); }else{ //处理其他的头部信息 response.setHeader("content-disposition", "attachment;filename="+new String(fileFullName.substring(fileFullName .lastIndexOf("/")+1).getBytes(Charsets.UTF_8), Charsets.ISO_8859_1)); } //向客户端输入流下载 response.getOutputStream().write(FileUtils.readFileToByteArray(new File(fileFullName))); } catch (Exception e) { // TODO: handle exception } }
接下来,我们来看第三个问题,下载的时候由于文件比较大,然后会报内存溢出的异常。
这种问题,一般也有两种解决方法,第一种切分大文件采用分而治之的方法下载,然后在下载的使用java.zip包里的工具类,进行压缩传输即可。第二种的就是调大JVM的内存和tomcat的内存,一般在正式的环境里服务器的配置应该会比较大,所以采取这种方法也是一种不错的方法。
至此,我们可以正常的进行下载了。
下载txt的文件: