我们知道以前我们要下载东西时,我们将连接加入到servlet端的java代码 例如下面的代码
public class Demo01 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 获取要下载的文件名字 aa.jpg --- inputStream
String fileName = request.getParameter("filename");
//2. 获取这个文件在tomcat里面的绝对路径地址
String path = getServletContext().getRealPath("download/"+fileName);
//让浏览器收到这份资源的时候, 以下载的方式提醒用户,而不是直接展示。
response.setHeader("Content-Disposition", "attachment; filename="+fileName);
//
response.sendRedirect("login_success.html");
//3. 转化成输入流
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0 ;
byte[]buffer = new byte[1024];
while( (len = is.read(buffer)) != -1){
os.write(buffer, 0, len);
}
os.close();
is.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
我们将需要下载的东西放入downlaod文件夹下,那么 在客户访问客户端后点击下载后,会跳转到我们服务端的servlet Dome1下,执行我们的java代码 ,并下载文件
而中文名的话,会出现资源找不到的情况发生
解决方法 注意和上面区分
public class Demo01 extends httpServlet{
protected void doGet(HttpServletRequest request ,httpServletResponse response)throws ServeletException,IOException{
//1. 获取要下载的文件名字 aa.jpg --- inputStream
String fileName = request.getParameter("filename");
// 得到字节数组
byte[] bytes = fileName.getBytes("ISo-8859-1");
fileName = new String(filename,"UTF-8");
//2. 获取这个文件在tomcat里面的绝对路径地址
String path = getServletContext().getRealPath("download/"+fileName);
/*
* 如果文件的名字带有中文,那么需要对这个文件名进行编码处理
* 如果是IE ,或者 Chrome (谷歌浏览器) ,使用URLEncoding 编码
* 如果是Firefox , 使用Base64编码
*/
//获取来访的客户端类型
String clientType = request.getHeader("User-Agent");
if(clientType.contains("Firefox")){
fileName = DownLoadUtil.base64EncodeFileName(fileName);
}else{
//IE ,或者 Chrome (谷歌浏览器) ,
//对中文的名字进行编码处理
fileName = URLEncoder.encode(fileName,"UTF-8");
//让浏览器收到这份资源的时候, 以下载的方式提醒用户,而不是直接展示。
response.setHeader("Content-Disposition", "attachment; filename="+fileName);
//
response.sendRedirect("login_success.html");
//3. 转化成输入流
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0 ;
byte[]buffer = new byte[1024];
while( (len = is.read(buffer)) != -1){
os.write(buffer, 0, len);
}
os.close();
is.close();
}
我们使用的工具类 base64EncodeFileName()
public static String base64EncodeFileName(String fileName){
BASE64Encoder base64Encoder =new BASE64Encoder();
try{
return "=?UTF-8?B?" + new String(base64Enconder.encode(fileName.getBytes("Utf-8")))+"?=";
} catch(UnsupportedEncodingException e){
e.printStackTrace();
throw new RuntimeException(e);
}
}