模拟文件下载(一):手动下载

这里我还有一个问题:

在把文件名通过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);
	}

}


posted @ 2018-05-17 21:43  五彩世界  阅读(167)  评论(0编辑  收藏  举报