response.setContentType() 及 header中Content-Disposition的作用与使用方法

1. response.setContentType() :

1.1 概述:

内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。
文件扩展名与 Content-type 的对应关系,参见 : http://tool.oschina.net/commons

1.2 常用方法:

response.setContentType("text/html"); // the most popular one 
response.setContentType("text/plain");  
response.setContentType("text/css"); // Cascading Style Sheet 
response.setContentType("application/html"); 
response.setContentType("image/gif"); 
response.setContentType("application/zip"); 
response.setContentType("application/pdf");
//当浏览器在请求资源时,会通过http返回头中的content-type决定如何显示/处理将要加载的数据,如果这个类型浏览器能够支持阅览,浏览器就会直接展示该资源,比如png、jpeg、video等格式。在某些下载文件的场景中,服务端可能会返回文件流,并在返回头中带上Content-Type:application/octet-stream,告知浏览器这是一个字节流,浏览器处理字节流的默认方式就是下载。
Application/octet-stream是应用程序文件的默认值。意思是未知的应用程序文件,浏览器一般不会自动执行或询问执行。浏览器会像对待,设置了HTTP头Content-Disposition值为attachment的文件一样来对待这类文件,即浏览器会触发下载行为。
sponse.setContentType("application/octet-stream"); 

2. Content-Disposition:

2.1 概述

是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件,该响应头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者网页的一部分),还是以附件的形式下载并保存到本地
当Internet Explorer接收到头时,他会激活文件下载对话框,它的文件名框自动填充headers指定的文件名。

服务器向浏览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等。如果需要提示用户保存,就要利用Content-Disposition进行处理,(敲黑板,划重点)关键在于一定要加上attachment [附件] 。
例如:

Response.AppendHeader("ContentDisposition","attachment;filename=FileName.txt");

这样的话,浏览器在打开的时候回提示保存还是打开,即使选择打开,也会使用相关联的程序,比如记事本打开,而不是IE直接打开。
Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。
具体的定义如下:

//content-disposition的定义
content-disposition ="Content-Disposition" ":"
                     disposition-type
                     *(";" disposition-param)
//disposition-type的定义
disposition-type="attachment"|disp-extension-token
//disposition-param的定义
disposition-param=filename-param|disp-extension-parm
//filename-param的定义
filename-param= "filename"  "=" quoted-string
//disp-extension-token的定义
disp-extension-token = token
//disp-extension-parm
token "=" ( token | quoted-string )

常用形式:

Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"

2.2 示例:

        fileName = URLEncoder.encode("导入模版.xlsx","utf-8");
        response.setHeader("Content-disposition","attachment; filename="+fileName);
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");

注意点:
当然filename参数可以包含路径信息,但User-Agnet会忽略这些信息,只会把路径信息的最后一部分作为文件名。当响应类型为application/octet-stream情况下使用上面的头信息的话,那么就不能直接显示内容,而是弹出一个"文件下载"的对话框,接下来就是用户决定“打开”还是“保存”了。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//region 数据源 List resultList = new ArrayList(); Model model = new Model(); model.setCode("01"); model.setName("测试1"); resultList.add(model); model = new Model(); model.setCode("02"); model.setName("测试2"); resultList.add(model); //endregion //获得模版 File directory = new File("src/main/resources/templates"); String templatePath = directory.getCanonicalPath(); String templateFile = templatePath + "\\template.xls"; //导出文件名 SimpleDateFormat simpl = new SimpleDateFormat("yyyyMMddHHmmss"); String currntTime = simpl.format(new Date()); String fileName = currntTime + "报表.xls"; //将结果放入 Map beans = new HashMap(); List values = new ArrayList(); values.add(resultList); beans.put("values", values); beans.put("title", "测试title"); //文件名称统一编码格式 fileName = URLEncoder.encode(fileName, "utf-8"); //生成的导出文件 File destFile = File.createTempFile(fileName, ".xls"); //transformer转到Excel XLSTransformer transformer = new XLSTransformer(); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { //将数据添加到模版生成新的文件 transformer.transformXLS(templateFile, beans, destFile.getAbsolutePath()); //将文件输入 InputStream inputStream = new FileInputStream(destFile); //设置response参数,可以打开下载页面 response.reset(); //设置响应文本格式 response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xls").getBytes(), "iso-8859-1")); //将文件输出到页面 ServletOutputStream out = response.getOutputStream(); bis = new BufferedInputStream(inputStream); bos = new BufferedOutputStream(out)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值