首先确定HTML页面上的编码格式 我这里是UTF-8
<meta http-equiv="content-type" content="text/html;charset=utf-8">
- 创建类继承HttpServlet ;
- 重写doGet或doPost,具体使用哪个看业务需求;
代码如下:
import sun.misc.BASE64Encoder;
import javax.servlet.ServletContext;
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.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
/**
* Created with IntelliJ IDEA.
* Description:
*
* @author: GanZiB
* Date: 2020-08-24
* Time: 10:16
*/
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//1.获取文件名
String fileName = req.getParameter("fileName");
//2.使用字节输入流加载文件进内存
//2.1找到文件服务器路径
ServletContext servletContext = req.getServletContext();
String realPath = servletContext.getRealPath("/res/" + fileName);
//2.2使用字节流关联
FileInputStream fis = new FileInputStream(realPath);
//3.设置response响应头
//3.1设置响应头类型:content-type
String agent = req.getHeader("user-agent");
String mimeType = servletContext.getMimeType(fileName);
resp.setHeader("content-type", mimeType);
//3.2设置响应头打开方式:content-disposition
resp.setHeader("content-disposition", "attachment;filename=" + getFileName(agent,fileName));
//4.将输入流数据写出到输出流中
ServletOutputStream sos = resp.getOutputStream();
byte[] buff = new byte[1024 * 8];
int len = 0;
while ((len = fis.read(buff)) != -1) {
sos.write(buff, 0, len);
}
fis.close();
}
/**
* 中文乱码适配不同浏览器
*/
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
// IE
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
//火狐
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes(StandardCharsets.UTF_8)) + "?=";
}else {
filename = URLEncoder.encode(filename,"utf-8");
}
return filename;
}
}
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<a href="/download?fileName=图片1.jpg">图片下载</a>
</body>
</html>