package download;
import utils.DownloadUtils;
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.FileInputStream;
import java.io.IOException;
/**
* 文件下载案例
* @Author WangGy
* @Create 2020-05-01-14:08
*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数,文件名称
String filename = request.getParameter("filename");
// System.out.println(filename);
//2.使用字节输入流加载文件进内存
//2.1找到文件服务器路径
ServletContext servletContext = request.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//2.2用字节流关联
FileInputStream fileInputStream = new FileInputStream(realPath);
//3.设置response的响应头
//3.1设置响应头类型
String mimeType = servletContext.getMimeType(filename);//获取文件MIME类型
response.setHeader("content-type",mimeType);
//3.2设置响应头打开方式:Content-Disposition,这边解决了中文问题
//response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(filename, "UTF-8"));
//解决中文文件名问题
//1.获取user-agent请求头
String header = request.getHeader("user-agent");
filename = DownloadUtils.getFileName(header, filename);
response.setHeader("Content-Disposition", "attachment; filename=" + filename);
//3.将输入流的数据写出到输出流中
ServletOutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len=fileInputStream.read(bytes)) != -1) {
outputStream.write(bytes,0,len);
}
fileInputStream.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下载页</title>
</head>
<body>
<a href="img/a.jpg">图片1</a>
<a href="img/赵默笙.mp4">视频1</a>
<hr>
<a href="/downloadServlet?filename=a.jpg">图片</a>
<a href="/downloadServlet?filename=赵默笙.mp4">视频</a>
</body>
</html>
运行截图:
这是出现乱码的情况:
//这里就用到DownloadUtils工具类
String header = request.getHeader("user-agent");
filename = DownloadUtils.getFileName(header, filename);
response.setHeader("Content-Disposition", "attachment; filename=" + filename);
下面的没有出现中文乱码