版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Fengj04/article/details/79705711
javaweb实现文件下载
- 实现文件下载
- 解决下载文件名带有中文乱码问题
效果图
实现思路
根据请求连接获取文件名和文件类型,设置响应头,获取输入流和输出流
核心代码
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String fileName = request.getParameter("fileName");
//获得请求头中的User-Agent
String agent = request.getHeader("User-Agent");
//根据不同浏览器进行不同的编码
String fileNameEncoder = "";
if (agent.contains("MSIE")) {
// IE浏览器
fileNameEncoder = URLEncoder.encode(fileName, "utf-8");
fileNameEncoder = fileNameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
fileNameEncoder = "=?utf-8?B?"+ base64Encoder.encode(fileName.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
fileNameEncoder = URLEncoder.encode(fileName, "utf-8");
}
//告诉浏览器解析文件的类型
response.setContentType(this.getServletContext().getMimeType(fileName));
//告诉浏览器不能解析文件且适配各种浏览器提供文件默认的名称
response.setHeader("Content-Disposition", "attachment;filename="+fileNameEncoder);
String realPath = getServletContext().getRealPath(fileName);
InputStream in = new FileInputStream(realPath);
ServletOutputStream out = response.getOutputStream();
int len = 0;
byte[] bytes = new byte[1024];
while ((len = in.read(bytes)) > 0)
{
out.write(bytes, 0, len);
}
out.close();
in.close();
}
重点
- response.setHeader(“Content-Disposition”, “attachment;filename=”+fileNameEncoder); 实现强制下载
- response.setContentType(this.getServletContext().getMimeType(fileName)); 可以省略
- 解决文件名称乱码问题
if (agent.contains(“MSIE”)) {
// IE浏览器
fileNameEncoder = URLEncoder.encode(fileName, “utf-8”);
fileNameEncoder = fileNameEncoder.replace(“+”, ” “);
} else if (agent.contains(“Firefox”)) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
fileNameEncoder = “=?utf-8?B?”+ base64Encoder.encode(fileName.getBytes(“utf-8”)) + “?=”;
} else {
// 其它浏览器
fileNameEncoder = URLEncoder.encode(fileName, “utf-8”);
}