http header中的Content-disposition
Access-Control-Expose-Headers
响应首部 Access-Control-Expose-Headers 列出了哪些首部可以作为响应的一部分暴露给外部。
默认情况下,只有六种 simple response headers (简单响应首部)可以暴露给外部:
- Cache-Control
- Content-Language
- Content-Type
- Expires
- Last-Modified
- Pragma
如果想要让客户端可以访问到其他的首部信息,可以将它们在 Access-Control-Expose-Headers 里面列出来。如下图所示:
Content-disposition概念
Content-disposition 是 MIME(电子邮件) 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会**文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)
服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment:
Response.AppendHeader(“Content-Disposition”,“attachment;filename=FileName.txt”);
备注:这样浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序比如记事本打开,而不是IE直接打开了。
作为消息主体中的消息头
Content-Disposition 属性是作为对下载文件的一个标识字段,Content-Disposition属性有两种类型:inline 和 attachment 。
- inline (默认值):将文件内容直接显示在页面;
- attachment:弹出对话框让用户下载。下面上代码:
- 在页面内打开代码:
response.setHeader("Content-Type","text/plain");
response.addHeader("Content-Disposition","inline;
filename="+new String(filename.getBytes(),"utf-8"));
response.addHeader("Content-Length",""+file.length());
- 弹出保存框代码:
response.setHeader("Content-Type","text/plain");
response.addHeader("Content-Disposition","attachment;
filename="+new String(filename.getBytes(),"utf-8"));
response.addHeader("Content-Length",""+file.length());
作为multipart body中的消息头
Content-Type: multipart/form-data;boundary="boundary"
Content-Disposition: form-data; name="field2"; filename="example.txt"
相关指令
name
后面是一个表单字段名的字符串,每一个字段名会对应一个子部分。在同一个字段名对应多个文件的情况下(例如,带有multiple 属性的元素),则多个子部分共用同一个字段名。如果name参数的值为 ‘charset’ ,意味着这个子部分表示的不是一个HTML字段,而是在未明确指定字符集信息的情况下各部分使用的默认字符集。
filename
后面是要传送的文件的初始名称的字符串。这个参数总是可选的,而且不能盲目使用:路径信息必须舍掉,同时要进行一定的转换以符合服务器文件系统规则。这个参数主要用来提供展示性信息。当与 Content-Disposition: attachment 一同使用的时候,它被用作"保存为"对话框中呈现给用户的默认文件名。
filename*
“filename” 和 “filename*” 两个参数的唯一区别在于,“filename*“采用了 RFC 5987 中规定的编码方式。当"filename” 和 “filename*” 同时出现的时候,应该优先采用"filename*”,假如二者都支持的话。
详细见:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition
使用注意事项:
1.当代码里面使用Content-Disposition来确保浏览器弹出下载对话框的时候。 response.addHeader(“Content-Disposition”,“attachment”);一定要确保没有做过关于禁止浏览器缓存的操作。
代码如下:
response.setHeader(“Pragma”, “No-cache”);
response.setHeader(“Cache-Control”, “No-cache”);
response.setDateHeader(“Expires”, 0);
不然会发现下载功能在opera和firefox里面好好的没问题,在IE下面就是不行。
推荐阅读
-
JavaScript中的HTTP跨域请求
-
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
-
如何解决Ajax访问不断变化的session的值不一致以及HTTP协议中的GET、POST的区别
-
Angularjs中$http以post请求通过消息体传递参数的实现方法
-
[日常] 使用TCPDUMP和Ethereal抓包分析HTTP请求中的异常情况
-
详解http请求中的Content-Type
-
PHP 使用header函数设置HTTP头的示例解析 表头
-
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
-
php模拟asp中的XmlHttpRequest实现http请求的代码
-
AngualrJS中每次$http请求时的一个遮罩层Directive