Response综合案例-文件下载
(1)文件的复制
本质就是将一个文件的所有字节读出来,再复制到另一个文件中(2)打开网络文件
浏览器读服务器的文件,本质也是复制(3)下载网络文件
本质文件复制,不过通过设置响应头,控制浏览器以附件的形式下载
response-综合案例-弹出保存框
如果需要浏览器弹出保存框,则需要通过设置响应头的两个指令
Content-Type 设置MIME-Type
Content-Disposition 设置附件名称
//指令,调用浏览器弹出下载框,由用户自己保存 response.setHeader("Content-Type", mimeType); response.setHeader("Content-Disposition", "attachment;filename="+saveName);1234
response-综合案例-getMimeType方法
(1)如何设置附件
HTTP协议规定,如果一个服务器的文件要以附件的形式下载,必须设置两个响应头
1:下载文件的类型(MIME类型) 由下载文件的后缀名决定
tomcat服务器中的web.xml中包含大量的扩展名对应的mime-type的对应关系
比如 a.jpg 对应的mime类型是 image/jpg
getMimeType(filename) //servletContext对象的方法1
2:设置一个头部信息,这个信息用来指定附件下载时,文件的名字
response-综合案例-文件名为中文
1: 如果是非中文的保存名称,浏览器可以正常保存,但如果是中文的话,需要进行先进行URL编码
美女 -----> %ED%AD%AC
2:不同的浏览器转码方式不一样: IE浏览器 火狐浏览器 其他浏览器
public String getFileName(HttpServletRequest request,String filename) throws UnsupportedEncodingException { String agent = request.getHeader("User-Agent"); 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; }1234567891011121314151617
完整下载代码
@WebServlet("/down")public class Demo05Servlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求参数中的文件名 String filename=request.getParameter("filename"); String saveName=getFileName(request,filename); //自动根据文件的后缀名得到mime-type类型 String mimeType = getServletContext().getMimeType(filename); System.out.println(mimeType); //指令,调用浏览器弹出下载框,由用户自己保存 response.setHeader("Content-Type", mimeType); response.setHeader("Content-Disposition", "attachment;filename="+saveName); //1.加载a.jpg文件成为一个输入流 InputStream inputStream = getServletContext().getResourceAsStream("download/"+filename); //2.再使用字节流 将数据写到浏览器 OutputStream outputStream = response.getOutputStream(); //3.浏览器自动将数据显示成图片 FileService fileService = new FileService(); fileService.copy(inputStream,outputStream); //4.关闭 outputStream.close(); inputStream.close(); } public String getFileName(HttpServletRequest request,String filename) throws UnsupportedEncodingException { String agent = request.getHeader("User-Agent"); 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; }}
作者:水巷石子
链接:https://blog.csdn.net/qq_37924905/article/details/108499993
来源:CSDN
著作权归作者所有,转载请联系作者获得授权,切勿私自转载。