利用HttpServletResponse的响应头实现文件下载

tech2022-12-05  112

一、首先编写文件下载的前端页面

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件下载页面</title> </head> <body> <h3>手动编码方式下载</h3> <a href="/day29_HttpServletRequest_81/DownLoadServlet?filename=document.zip">document.zip</a><br> <a href="/day29_HttpServletRequest_81/DownLoadServlet?filename=DownloadServlet.java">DownloadServlet.java</a><br> <a href="/day29_HttpServletRequest_81/DownLoadServlet?filename=feiji03.gif">feiji03.gif</a><br> <a href="/day29_HttpServletRequest_81/DownLoadServlet?filename=飞机03.gif">飞机03.gif</a><br> </body> </html>

每一次点击下载,都会进入到DownLoadServlet中进行下载处理。 二、编写DownLoadServlet

package com.itheima.Servlet; import com.itheima.utils.DownLoadUtils; import sun.misc.IOUtils; import javax.servlet.ServletContext; import javax.servlet.ServletException; 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.InputStream; import java.io.OutputStream; /*文件下载*/ @WebServlet(name = "DownLoadServlet", urlPatterns = "/DownLoadServlet") public class DownLoadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); /*文件下载的核心:两个头,两个流*/ /*准备工作*/ //1、获得ServletContext对象 ServletContext context= this.getServletContext(); //2、获得文件名称,获得请求参数,确定请求下载的文件 String filename=request.getParameter("filename"); //3、获得文件的MIME类型 String mimeType=context.getMimeType(filename); //4、获得文件的真实路径 String realPath=context.getRealPath("/download/"+filename); /*设置两个头*/ //5、设置Content-Type头 response.setHeader("Content-Type",mimeType ); //11.获得请求头User-Agent(针对不同的浏览器进行乱码处理) String header=request.getHeader("User-Agent"); //12.处理不同浏览器的中文乱码问题 filename= DownLoadUtils.getName(header,filename); //6、设置Content-Disposition头(告诉浏览器无论如何都要弹出一个文件下载框) response.addHeader("Content-Disposition","attachment;filename="+filename ); /*设置两个流*/ //7、创建一个输入流(多态) InputStream is=new FileInputStream(realPath); //8、获得一个输出流(多态) OutputStream os=response.getOutputStream(); //9、流拷贝 org.apache.commons.io.IOUtils.copy(is, os); //10、释放资源 is.close(); os.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

三、解决中文乱码的问题DownLoadUtils

package com.itheima.utils; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import sun.misc.BASE64Encoder; public class DownLoadUtils { 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; } }

四、实验结果

最新回复(0)