zoukankan      html  css  js  c++  java
  • 模拟文件下载(一):手动下载

    这里我还有一个问题:

    在把文件名通过content-disposition响应头进行传递的时候,其中的filename='图片.png'中出现中文的时候;

    为什么文件名中的中文在用URLEncoder进行encode的时候,必须使用utf-8进行encode,浏览器为什么知道得到文件之后,要用utf-8对这个中文名进行decode?为什么在chrome下,下载的文件的名字不是按照filename后面的名字,而是做用做下载的servlet的名字?

    其中load的位置:

    jsp中的代码:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>文件下载</title>
      </head>
      <body>
    	<a href="${pageContext.servletContext.contextPath }/servlet/DownloadDemo01">下载文件</a>   
      </body>
    </html>
    

    作为下载的servlet中的代码:

    package download;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * 下载还是要使用后台代码来下载!
     * 		才可以做逻辑
     * @author mzy
     * 
     * request中有中文 -> 
     * 		通过form表单的方式的时候:
     * 		浏览器传输(自动加密:URLEncoder) -> 服务器获取(自动解密:URLDecoder) 
     * 		
     * 		但是服务器获取的时候
     * 			get方式和tomcat中默认的urlencoding不同的时候要手动转码
     * 			post方式中必须设置setCharacterEncoding才能够正常解码
     * 
     * response中有中文 -> 
     * 		首先通过服务器端进行URLEncoder进行加密之后,放到服务器上进行传输
     * 		
     * 		服务器(加密后的) -> 浏览器(自动解密:URLDecoder)
     *
     */
    public class DownloadDemo01 extends HttpServlet {
    
    	private static final long serialVersionUID = -4737876568856179118L;
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		/*
    		 * 这里可以做逻辑!
    		 */
    		
    		
    		// 1) 读取服务器的文件
    		// 读取当前web应用的根目录下的文件,返回绝对路径
    		/*
    		String path = this.getServletContext().getRealPath("/load/1.jpg");
    		FileInputStream in = new FileInputStream(new File(path));
    		*/
    		String fileName = "图片.png";
    		// 先从服务器上通过这个名称正常的把文件给读出来
    		InputStream in = this.getServletContext().getResourceAsStream("/load/"+fileName);
    		
    		
    		/* 把fileName通过URLEncoder进行加密,加密之后通过响应头进行传输
    		 * 问题:
    		 * 		我用URLEncoder的encode方法使用utf-8进行加密之后;
    		 *		浏览器怎么知道用utf-8进行解密?还是对响应头中的URLEncoder加密后的中文或者特殊字符等
    		 *		默认使用utf-8进行解密? 
    		 */
    		fileName = URLEncoder.encode(fileName, "utf-8"); 
    		/*
    		 * 设置一个响应头:
    		 * 		content-disposition:告诉浏览器以下载的方式打开该资源!
    		 */
    		// response.setHeader("content-disposition", "attachment;filename="+fileName);
    		/*
    		 * 注意这里的响应头,不同的浏览器在识别content-disposition值的内容有差异
    		 * 		IE:attachment;filename=xxx.jpg
    		 * 		非IE:attachment;filename*=xxx.jpg
    		 */
    		
    		String userAgent = request.getHeader("user-agent"); // 获取user-agent
    		if(userAgent.contains("Trident")) {
    			response.setHeader("content-disposition", "attachment;filename="+fileName);
    		} else {
    			response.setHeader("content-disposition", "attachment;filename*="+fileName);
    		}
    		
    		// 2) 把文件内容发送给浏览器
    		OutputStream out = response.getOutputStream();
    		byte[] buf = new byte[1024];
    		int len;
    		while((len=in.read(buf)) != -1) {
    			out.write(buf, 0, len);
    		}
    		
    		out.close();
    		in.close();
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		
    		doGet(request, response);
    	}
    
    }
    


  • 相关阅读:
    python os模块汇总
    python xlsxwriter使用方法汇总
    python 虚拟环境生成requirements.txt 和利用requirements.txt批量安装
    python 中将大列表拆分成小列表
    python print的用法
    python学习
    浮躁
    在线绘图工具
    开通园子
    iOS拓展---(APP)进程间常用通信方式总结
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053444.html
Copyright © 2011-2022 走看看