版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MyBabyChao/article/details/82353767
编码前的准备
1.download文件夹中放置需要下载的文件
2.download文件夹放置在WebContent目录下
下载页面(index.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>手动下载文件</h2><br>
<a href="Demo?filename=aa.jpg">aa.jpg</a><br>
<a href="Demo?filename=bb.txt">bb.txt</a><br>
<a href="Demo?filename=cc.rar">cc.rar</a><br>
<a href="Demo?filename=黑马.png">黑马.png</a><br>
</body>
</html>
请求发送给名为Demo的Servlet处理,并传递文件名filename=**。
Demo中的代码
代码中使用了DownloadUtil的工具类
package com.mbc.servlet;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取要下载的文件的名字
String filename = request.getParameter("filename");
//点击下载链接后,发送过来的是get请求,所以会出现中文乱码的问题。
//解决因为中文乱码,而找不到相应文件的问题
filename = new String(filename.getBytes("ISO-8859-1"), "UTF-8");
//2.获取文件在Tomcat中的路径
String path = this.getServletContext().getRealPath("download/"+filename);
//3.获取下载的文件流
InputStream is = new FileInputStream(path);
//4.获取输出流
OutputStream os = response.getOutputStream();
//解决当文件名存在中文时,下载框中的中文无法显示的问题。
//方法一
//这里要分两种情况
//1.火狐浏览器(需要将文件名转为base64编码格式)
//2.IE、谷歌浏览器....等浏览器(需要将文件名转为application/x-www-form-urlencoded MIME)
//(1)获取浏览器信息
// String userAgent = request.getHeader("User-Agent");
// System.out.println(userAgent);
//(2)根据浏览器判断使用哪种编码格式
// if(userAgent.contains("Firefox")) {
// filename = DownloadUtil.base64EncodeFileName(filename);
// }else {
// filename = URLEncoder.encode(filename, "utf-8");
// }
//方法二
filename=new String(filename.getBytes("utf-8"),"ISO-8859-1");
//或
//filename=new String(filename.getBytes("gbk"),"ISO-8859-1");
//设置:当浏览器收到这份资源的时候,以下载的方式提醒用户,而不是直接显示
response.setHeader("Content-Disposition", "attachment; filename=" + filename);
byte[] buffer = new byte[1024];
int len = 0;
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 {
// TODO Auto-generated method stub
doGet(request, response);
}
}
DownloadUtil代码
package com.mbc.servlet;
import java.io.UnsupportedEncodingException;
import sun.misc.BASE64Encoder;
public class DownloadUtil {
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
总结
1.获取request请求发送的数据中包含中文时,要处理乱码的问题。
2.解决下载框无法显示中文的问题。
3.解决了乱码问题之后,就是普通的IO流操作。