最近在做JSP网站的时候,需要实现文件上传下载,中间乱码问题很是让人头疼。尤其是下载时,于是乎把网上说的几种文件下载方式实现了一下。具体如下
这里我们以根目录下《世说新语》.ppt作为下载文件
方法一、利用RequestDispatcher
当输出文件名保存为中文时,不是乱码而是直接不读....怎么改没有看,因为网上都不是很推崇这种办法
response.setContentType("application/x-download");//设置为下载application/x-download
String filedownload = "/《世说新语》.ppt";//即将下载的文件的相对路径
String filedisplay = "《世说新语》.ppt";//下载文件时显示的文件保存名称
String filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
try
{
RequestDispatcher dis = application.getRequestDispatcher(filedownload);
if(dis!= null)
{
dis.forward(request,response);
}
response.flushBuffer();
}
catch(Exception e)
{
e.printStackTrace();
}
方法二、利用流(主流)
网上很多推荐用这个
//加上response.reset(),并且所有的%》后面不要换行,包括最后一个
response.reset();
response.setContentType("application/x-download");
//application
String path = request.getRealPath("/");
String filedownload = path+"《世说新语》.ppt";
String filedisplay="《世说新语》.ppt";
//处理文件名乱码
filedisplay = URLEncoder.encode(filedisplay, "UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filedisplay); OutputStream outp = null; FileInputStream in = null; outp = response.getOutputStream(); in = new FileInputStream(filedownload); byte[] b = new byte[1024]; int i=0; while( (i=in.read(b)) > 0 ){ outp.write(b,0,i); } // outp.flush(); out.clear(); out = pageContext.popBody(); in.close(); out.close();
在几个浏览器试了一下,发现用火狐时,文件名依然乱码。
原因是火狐内核不同,解析方式不同,需要不同乱码处理方案。于是修改如下
String agent = (String)request.getHeader("USER-AGENT");
if(agent != null && agent.indexOf("MSIE") == -1) {// FF
filedisplay = new String(filedisplay.getBytes("utf-8"), "iso-8859-1");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + filedisplay);
} else { // IE
filedisplay = URLEncoder.encode(filedisplay, "UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
}
方法三、用SmartUpLoad
smartUpLoad 还是比较方便的包,上传下载的文件控制操作起来方便很多。文件乱码网上也给出了方案,需要改源代码,这里就不细说。但是做出的效果依然是用火狐浏览器会乱码,应该是也加上浏览器判断,修改一下相应的编码问题。这里给个smartUPLoad简单的例子
还有很多方法,大家可以网上看一下文档//初始化
//初始化
SmartUpload su = new SmartUpload();
//初始化
su.initialize(pageContext);
//设定contetnDisposition为null 禁止浏览器自动打开文件
//保证点击连接后是下载文件。若不设定,则下载的文件扩展名为
//doc时,浏览器将自动用word打开。扩展名为pdf时,
//浏览器将用acrobat打开
su.setContentDisposition(null);
//下载文件,文件路径
su.downloadFile("《世说新语》.ppt");
//su.downloadFile("《世说新语》.ppt","ppt", "《世说新语》.ppt",1);
总结:在要求不高的情况下,还是喜欢第二种方法。毕竟用别人的包一旦有bug改起来还是相当麻烦..