Java基础——response.setContentType(...)与response.addHeader(...)或setHeader(...)

在Java开发下载功能时,我们都会看到以下这两句代码或类似这两句代码的代码:

response.setContentType("application/x-msdownload");//三大主流浏览器(IE、Firefox、Google )

response.setContentType("application/octet- stream");//除了三大浏览器再加上Mac的Safari

response.addHeader("Content-Disposition", "attachment; filename=" + new String(filename.getBytes("GBK"), "ISO8859-1"));使用该段代码时,Mac系统上火狐或Safari等浏览器下载的文件名或内容可能会乱码,那就使用以下终极编码方式

response.setHeader( "Content-Disposition", "attachment; filename="+ new String(fn.getBytes("UTF-8"), "ISO-8859-1") );

以下就这两句代码作用做简要阐述:

response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据;

Content-Type:它定义了数据的类型,以便数据能被适当的处理。有效的类型有:text,image,audio,video,applications,multipart和message。注意任何一个二进制附件都应该被叫做application/octet- stream

response.addHeader(),"Content-Disposition":MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名,就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment;filename 必须保留扩展名部分(xxx.doc), 文件名中的中文才能正确解码, 否则可能不识别%20(空格), 甚至在ie6下全部都是未解码的格式(%xx)。new String(filename.getBytes("GBK"), "ISO8859-1"))new String(filename.getBytes("UTF-8"), "ISO8859-1")),避免下载的文件名乱码。

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。详见百度MIME!

response.addHeader()response.setHeader():可能在我们使用的时候,用起来感觉都一样,都能达到想要的效果,但它们本质上却是不一样的:

setHeader(name, value):如果Header中没有定义则添加,如果已定义则用新的value覆盖原用value值。

addHeader(name, value):如果Header中没有定义则添加,如果已定义则保持原有value不改变。

注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。

你可能感兴趣的:(Java基础)