前言
本次项目设计的jar包
hutool-all-5.2.3.jar(自行下载)
一、通过java代码下载文件?
-
告知客户端下载文件的MIME类型
Content-Type:MIME类型 -
告知浏览器以附件的方式打开
Content-Disposition:attachment;filename=文件名
废话少说,上代码
二、使用步骤
1.创建项目
`
2.引入jar包
3.编写代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="add.html">添加学生</a>
<a href="findAll">查询学生</a>
<a href="dw2?name=1.CHM">下载jpk</a>
<a href="dw2?name=2.txt">下载文本文档</a>
</body>
</html>
package com.itheima.controller;
import cn.hutool.core.io.IoUtil;
import com.itheima.utils.DownUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
@WebServlet("/dw4")
public class Servlet004 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext sc = getServletContext();
//获取文件下载的参数
String name = request.getParameter("name");
System.out.println(name);
//设置文件下载的请求头
String name1 = DownUtils.getName(request.getHeader("user-agent"), name);
response.setHeader("content-Disposition", "attachement;filename=" + name1);
//设置文件的mime类型,需要使用getServletContext对象
response.setContentType(sc.getMimeType(name));
//获取文件的输入流
InputStream in = sc.getResourceAsStream("/download/" + name);
ServletOutputStream outputStream = response.getOutputStream();
//开始下载
IoUtil.copy(in, outputStream);
//释放资源
outputStream.close();
in.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
package com.itheima.utils;
import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
/**
* @date 2021年04月29日 19:38
*/
public class DownUtils {
public static String getName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
总结
注意:对于浏览器来说,文件下载的时候,若出现中文名称,就需要根据浏览器的不同,对文件名称进行编码
- firefox浏览器要求中文需要使用base64编码
- 其他浏览器要求使用utf-8编码即可