最新在做项目时,遇到这样的一个问题,前端调用servlet 时中文乱码,并且下载下来中文文件名为“--”,后来查询相关资料,完美解决,现贴上代码,给自己做个日记,方便以后查阅!源码如下:
package com.test;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
/**
* @author lt
* 文件下载类
*/
public class FileDownloadServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
public FileDownloadServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
response.setContentType(CONTENT_TYPE);
//得到下载文件的名字
String filename= request.getParameter("filename");
if (filename==null || filename.equals("")) {
} else {
//设置临时文件存储位置
String base = "c:/upload/";
//创建file对象
File file=new File(base+filename);
response.setContentType("application/x-msdownload");
//解决中文乱码
response.addHeader("Content-Disposition","attachment;filename="+encodingFileName(filename));
//写明要下载的文件的大小
response.setContentLength((int)file.length());
response.addHeader("content-length", Long.toString(file.length()));
//读出文件到i/o流
FileInputStream fis=new FileInputStream(file);
BufferedInputStream buff=new BufferedInputStream(fis);
byte [] b=new byte[1024];//相当于我们的缓存
long k=0;//该值用于计算当前实际下载了多少字节
//从response对象中得到输出流,准备下载
OutputStream out=response.getOutputStream();
//开始循环下载
while(k<file.length()){
int j=buff.read(b,0,1024);
k+=j;
//将b中的数据写到客户端的内存
out.write(b,0,j);
}
//将写入到客户端的内存的数据,刷新到磁盘
out.flush();
}
}
public static String encodingFileName(String fileName) {
String returnFileName = "";
try {
returnFileName = URLEncoder.encode(fileName, "UTF-8");
returnFileName = StringUtils.replace(returnFileName, "+", "%20");
if (returnFileName.length() > 150) {
returnFileName = new String(fileName.getBytes("GB2312"), "ISO8859-1");
returnFileName = StringUtils.replace(returnFileName, " ", "%20");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return returnFileName;
}
}
前端js,直接传递中文文件名,传不过去,不知道什么原因,但是如果传递的是数字,可以传递过去
cell.innerHTML = '<a href="javascript:void(0);" onClick="downLoadFile(this)">'+fjInfo.FILE_NAME+'</a>';
所以想了一个这种的办法,传递this
function downLoadFile(obj){
var fileName=obj.innerHTML;
fileName= encodeURIComponent(fileName);
location.href='FileDownloadServlet.htm?filename='+fileName;
}