文件下载需求
- 页面显示超链接
- 点击链接之后弹出下载提示框
- 完成图片文件的下载
分析
- 超链接指向的资源能够被浏览器解析,则在浏览器当中展示,如果不能展示,则弹出提示框。这不满足需求
- 需求:任何的资源都必须弹出提示框
- 使用响应头设置资源的打开方式:
content-disposition:attachment;filename=xxx
步骤
- 编写超链接的href属性,指向一个servlet
- 使用字节输入流加载文件进入内存
- 指定response的响应头
- 将数据输出到response的输出流即可
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>download</title>
</head>
<body>
<a href="/down?filename=d.jpg">点我下载文件</a>
</body>
</html>
package cn.web;
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;
@WebServlet(urlPatterns = {"/down"})
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String filename = req.getParameter("filename");
ServletContext servletContext = this.getServletContext();
String path = servletContext.getRealPath("/image/" + filename);
FileInputStream fileInputStream = new FileInputStream(path);
resp.setContentType(servletContext.getMimeType(filename));
resp.setHeader("content-disposition", "attachment;filename=迪士尼.jpg");
ServletOutputStream outputStream = resp.getOutputStream();
byte[] buff = new byte[1024 * 8];
int len = 0;
while((len = fileInputStream.read(buff)) != -1) {
outputStream.write(buff, 0, len);
}
fileInputStream.close();
}
}
文件名中文乱码问题的解决
- 不同的浏览器会发生不同的中文乱码问题
- 解决方法:使用工具类修改文件名即可
package cn.web;
import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class DownLoadUtils {
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
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("utf-8")) + "?=";
} else {
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
resp.setContentType(servletContext.getMimeType(filename));
filename = DownLoadUtils.getFileName(req.getHeader("user-agent"), "迪士尼.jpg");
resp.setHeader("content-disposition", "attachment;filename=" + filename);