content-Disposition
下载
1、下载就是向客户端响应字节数据
原来我们响应的都是html字符数据
把一个文件变成字节数据,使用response.getOutputStream()来响应客户端
2、下载的要求
两个头一个流
Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/jpeg
通过文件名称调用servletContext的getMimeType()方法,得到MIME类型
String filePath = “D:\时间都去哪儿了.mp3”;
String contentType = this.getServletContext().getMimeType(filePath);
response.setCharacterEncoding(“UTF-8”);
response.setContentType(contentType);
Content-Disposition:它的默认值是inline,表示在浏览器窗口打开,attachment;filename=xxx,浏览器跳出下载框
在filename=后面跟随的是显示在下载框中的文件名称
String contentDisposition = “attachment;filename=”+URLEncoder.encode(“时间都去哪儿了.mp3”, “UTF-8”);
response.setHeader(“Content-Disposition”, contentDisposition);
流:要下载的文件数据。
自己new一个输入流即可!
FileInputStream is = new FileInputStream(filePath);
ServletOutputStream os = response.getOutputStream();
IOUtils.copy(is, os);
is.close();
源码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filePath = "D:\\时间都去哪儿了.mp3";
String contentType = this.getServletContext().getMimeType(filePath);
System.out.println(contentType);
String contentDisposition = "attachment;filename*=UTF-8''"+URLEncoder.encode("时间都去哪儿了.mp3", "UTF-8");
FileInputStream is = new FileInputStream(filePath);
response.setCharacterEncoding("UTF-8");
response.setContentType(contentType);
//response.setHeader("content-Type", contentType);
response.setHeader("Content-Disposition", contentDisposition);
ServletOutputStream os = response.getOutputStream();
IOUtils.copy(is, os);
is.close();
}
3、中文名乱码问题
3.1、使用指定编码,并告诉浏览器编码类型
Content-Disposition : attachment; filename* = UTF-8''%E6%96%87%E4%BB%B6.txt
向下兼容:
Content-Disposition: attachment;
filename=”encoded_text”;
filename*=utf-8”encoded_text
filename*=编码类型”使用编码类型来编码的文件名
String contentDisposition = "attachment;filename=" + URLEncoder.encode("时间都 去哪儿了.mp3", "UTF-8")
+ ";filename*=UTF-8''" + URLEncoder.encode("时间都去哪 儿了.mp3", "UTF-8");
//优先使用filename*=utf-8''encoded_text;没有这个或者这个解码出问题了,使用filename="encoded_text";
相关阅读
今天查看Struts2的文件上传部分 发现有个例子开头打印的信息中有Content-Disposition,一时好奇,所以了解了一下。顺便学习一下文件