文件下载Demo
实现文件下载
需求:
1.页面显示超链接
2.点击超链接弹出下载提示框
3.完成图片文件下载
分析:
1.超链接指向的资源如果被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框,不满足需求
2.任何资源都必须弹出下载提示框
3.使用响应头设置资源的打开方式
实现步骤:
1.定义页面,编辑超链接href属性,指向servlet,传递资源的filename
2.定义servlet
2.1获取文件的名称
2.2使用字节输入流加载文件进内存
2.3指定response的响应头,
2.4将数据写出到response输出流
3.设置响应头类型及响应头打开方式
4.在数据写入到输出流中
package com.infosys.servlet; 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.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; @WebServlet("/downloadServlet") public class ServletDownloadDemo1 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取文件名称,也就是url请求什么文件,name对应拿到什么文件名 String filename = req.getParameter("filename"); //2.1创建ServletContext对象,来获取真实想路径 ServletContext context = this.getServletContext(); String realPath = context.getRealPath("/images/" + filename); //2.2创建文件输入流将项目路径内的文件加载到内存 FileInputStream fls = new FileInputStream(realPath); //3.设置响应头 String mimeType = getServletContext().getMimeType(filename); //3.1设置响应头类型 resp.setHeader("content-type", mimeType); //获取user-agent请求头 String agent = resp.getHeader("user-agent"); //使用工具类方法编译中文文件名 fileName = DownLoadUtils.getFileName(agent, filename); //3.2设置响应头打开方式 resp.setHeader("content-disposition", "attachment;filename=" + filename); //在数据写入到输出流中 ServletOutputStream sos = resp.getOutputStream(); byte[] buff = new byte[1024 * 8]; int len = 0; while ((len = fls.read(buff)) != -1) { sos.write(buff, 0, len); } fls.close(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }
download.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <a href="/response/downloadServlet?filename=like1.jpg">图片</a> <a href="/response/downloadServlet?filename=like1.avi">视频</a> </body> </html>
在download.html页面中点击超链接,就会访问到对应的servlet,执行doPost里的方法,对应完成资源的下载。
ps . 如果文件名是中文,在下载弹出框可能会出现中文无法显示的问题,可以通过此工具类来解决此问题。
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")) { // 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("utf-8")) + "?="; } else { // 其它浏览器 filename = URLEncoder.encode(filename, "utf-8"); } return filename; } }