这里我还有一个问题:
在把文件名通过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);
}
}