HTTP 报头,Content-disposition
[转]文件下载中文显示content-disposition正确设置----http:hi。。。
[转]⽂件下载中⽂显⽰content-disposition正确设置----http:hi。
【转】⽂件下载中⽂显⽰ content-disposition 正确设置补充: 在IE下,filename 必须保留扩展名部分(xxx.doc), ⽂件名中的中⽂才能正确解码, 否则可能不识别%20(空格), 甚⾄在ie6下全部都是未解码的格式(%xx).另外原始的空格使⽤urlEncode 编码后转换为+号(基于历史原因), ⽽ie解析时会直接作为+号处理, 因此需要⼿⼯替换⼀下这个特殊字符.URLEncoder.encode("中⽂+ en", "UTF-8").replaceAll("\\+", "%20");safari相对⽐较变态, filename部分只能使⽤utf-8的原始字节,⽽http header 必须使⽤单字节编码的字符串, 因此需要将原始内容重新构造为iso-8859-1单字节编码的字符串,即:new String(filename.getBytes("UTF-8"),"ISO8859-1")另外我⽤了⼏个新的浏览器做了⼏个对⽐测试编码⽅式 | 测试通过的浏览器RFC2231 filename* | ie9 ,chrome17 , opera11,firefox11iso-8859-1 (utf-8): | chrome,opera,firefox,safariurl-encode(utf-8) | ie6+ (⽂件名必须带扩展名), chrome\opera(%2B 加号不识别)因此兼容规则设置为 ie: urlEncode , opera\firefox : filename*, safari\chrome: iso-8859-1 ⽐较合适-------------- 割~~~ ------------------浏览器能正确识别的编码格式,只要按照这样的编码来设置对应的Content-Disposition,那么应该就不会出现中⽂⽂件名的乱码问题了。
http报文常见的请求头、响应头
http报⽂常见的请求头、响应头http报⽂常见的请求头1.AcceptAccept: text/html 浏览器可以接受服务器回发的类型为 text/html。
Accept: /代表浏览器可以处理所有类型,(⼀般浏览器发给服务器都是发这个)。
2.Accept-EncodingAccept-Encoding: gzip, deflate 浏览器申明⾃⼰接收的编码⽅法,通常指定压缩⽅法,是否⽀持压缩,⽀持什么压缩⽅法(gzip,deflate),(注意:这不是只字符编码)。
3.Accept-LanguageAccept-Language:zh-CN,zh;q=0.9 浏览器申明⾃⼰接收的语⾔。
4.ConnectionConnection: keep-alive 当⼀个⽹页打开完成后,客户端和服务器之间⽤于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的⽹页,会继续使⽤这⼀条已经建⽴的连接。
Connection: close 代表⼀个Request完成后,客户端和服务器之间⽤于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建⽴TCP连接。
5.Host(发送请求时,该报头域是必需的)Host: 请求报头域主要⽤于指定被请求资源的Internet主机和端⼝号,它通常从HTTP URL中提取出来的。
6.Refererer-AgentUser-Agent:Mozilla/...,告诉HTTP服务器,客户端使⽤的操作系统和浏览器的名称和版本。
8.Cache-ControlCache-Control:private 默认为private 响应只能够作为私有的缓存,不能再⽤户间共享Cache-Control:public 响应会被缓存,并且在多⽤户间共享。
正常情况, 如果要求HTTP认证,响应会⾃动设置为 private.Cache-Control:must-revalidate 响应在特定条件下会被重⽤,以满⾜接下来的请求,但是它必须到服务器端去验证它是不是仍然是最新的。
http协议格式
http协议格式HTTP(Hypertext Transfer Protocol)是构建互联网应用的基础协议之一,它定义了客户端和服务器之间进行通信的格式和规则。
HTTP协议的主要目标是实现一种简单而灵活的方式来传输超文本,以便可以访问和传输网页、图片、视频等资源。
HTTP协议的格式主要包括请求格式和响应格式。
下面分别介绍这两种格式。
一、请求格式HTTP请求由客户端发送给服务器,用于请求对特定资源的访问。
请求格式包括请求行、请求头部和请求主体。
1. 请求行:请求行的格式为:METHOD URL HTTP/版本号其中,METHOD表示请求方法,包括常见的GET、POST、PUT、DELETE等;URL代表请求的资源的路径;HTTP/版本号指定了使用的HTTP协议的版本。
2. 请求头部:请求头部包括多行,每行由键值对组成。
常见的头部有:- Host:指定请求的服务器主机名和端口号。
- User-Agent:客户端的浏览器信息。
- Accept:客户端可以接受的数据类型。
- Content-Type:请求主体的数据类型。
3. 请求主体:请求主体是可选的,用于在POST请求中向服务器传送数据。
二、响应格式服务器接收到客户端的请求后,返回给客户端一个响应。
响应格式包括状态行、响应头部和响应主体。
1. 状态行:状态行的格式为:HTTP/版本号状态码状态描述其中,状态码表示服务器处理请求的结果,常见的状态码有200(成功)、404(资源未找到)、500(服务器内部错误)等。
2. 响应头部:响应头部和请求头部的格式类似,由多行键值对组成。
常见的头部有:- Content-Type:响应主体的数据类型。
- Content-Length:响应主体的长度。
- Set-Cookie:设置响应的Cookie。
3. 响应主体:响应主体是服务器返回给客户端的数据。
三、HTTP协议的特点1. 简单灵活:HTTP协议采用简单的文本格式,易于理解和编写。
http请求头中的content-type属性
http请求头中的content-type属性在HTTP请求中,我们每天都在使⽤Content-Type来指定不同格式的请求信息,但是却很少有⼈去全⾯了解Content-Type中允许的值有多少,因此这⾥来了解⼀下Content-Type的可⽤值,以及在Spring MVC中如何使⽤它们来映射请求信息。
什么是Content-Type要知道什么是Content-Type,⾸先要了解什么是Internet Media Type。
Internet Media Type即互联⽹媒体类型,也叫做MIME类型,使⽤两部分标识符来确定⼀个类型。
在HTTP协议消息头中,使⽤Content-Type来表⽰具体请求中的媒体类型信息,意思就是说,Content-Type是Internet Media Type在HTTP协议中的别称。
Content-Type的格式type/subtype(;parameter)? type上⾯是Content-Type的格式,可以拆解为三个部分,分别是主类型(type)、⼦类型(subtype)和参数(parameter)。
主类型(type)主类型可以是任意的字符串,⽐如text。
如果是*号则代表所有类型。
⼦类型(subtype)⼦类型可以是任意的字符串,⽐如html。
如果是*号则代表所有类型。
参数(parameter)参数是可选的,可以在Content-Type中加⼊⼀些特殊的参数,⽐如Accept请求头的参数,常见的有⽤于设置字符编码的charset参数。
Content-Type: text/html;charset:utf-8;Content-Type中常见的媒体格式类型以text开头的媒体格式类型:text/html: HTML格式。
text/plain:纯⽂本格式。
text/xml: XML格式。
以image开头的媒体格式类型:image/gif:gif图⽚格式。
image/jpeg:jpg图⽚格式。
http协议报头详解HTTP协议结构
http协议报头详解HTTP协议结构http协议请求报⽂和响应报⽂都是由以下4部分组成1.请求⾏2.请求头3.空⾏4.消息主体下图为http请求的报⽂结构下图为http响应报⽂结构请求⾏格式为:Method Request-URI HTTP-Version 结尾符结尾符⼀般⽤\r\n请求头通⽤报头既可以出现在请求报头,也可以出现在响应报头中Date:表⽰消息产⽣的⽇期和时间Connection:允许发送指定连接的选项,例如指定连接是连续的,或者指定“close”选项,通知服务器,在响应完成后,关闭连接Cache-Control:⽤于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独⽴的(⼀个消息的缓存指令不会影响另⼀个消息处理的缓存机制)请求报头请求报头通知服务器关于客户端求求的信息,典型的请求头有:Host:请求的主机名,允许多个域名同处⼀个IP地址,即虚拟主机User-Agent:发送请求的浏览器类型、操作系统等信息Accept:客户端可识别的内容类型列表,⽤于指定客户端接收那些类型的信息Accept-Encoding:客户端可识别的数据编码Accept-Language:表⽰浏览器所⽀持的语⾔类型Connection:允许客户端和服务器指定与请求/响应连接有关的选项,例如这是为Keep-Alive则表⽰保持连接。
Transfer-Encoding:告知接收端为了保证报⽂的可靠传输,对报⽂采⽤了什么编码⽅式。
响应报头⽤于服务器传递⾃⾝信息的响应,常见的响应报头:Location:⽤于重定向接受者到⼀个新的位置,常⽤在更换域名的时候Server:包含可服务器⽤来处理请求的系统信息,与User-Agent请求报头是相对应的实体报头实体报头⽤来定于被传送资源的信息,既可以⽤于请求也可⽤于响应。
请求和响应消息都可以传送⼀个实体,常见的实体报头为:Content-Type:发送给接收者的实体正⽂的媒体类型Content-Lenght:实体正⽂的长度Content-Language:描述资源所⽤的⾃然语⾔,没有设置则该选项则认为实体内容将提供给所有的语⾔阅读Content-Encoding:实体报头被⽤作媒体类型的修饰符,它的值指⽰了已经被应⽤到实体正⽂的附加内容的编码,因⽽要获得Content-Type报头域中所引⽤的媒体类型,必须采⽤相应的解码机制。
HTTP请求中,几种常见的Content-Type类型
HTTP请求中,⼏种常见的Content-Type类型POST请求的消息主体放在entity body中,服务端根据请求头中的Content-Type字段来获取消息主体的编码⽅式,进⽽进⾏解析数据。
⼀、application/x-www-form-urlencoded最常见的 POST 提交数据的⽅式,原⽣Form表单,如果不设置 enctype 属性,默认为application/x-www-form-urlencoded ⽅式提交数据。
⾸先,Content-Type被指定为 application/x-www-form-urlencoded;其次,提交的表单数据会转换为键值对并按照 key1=val1&key2=val2的⽅式进⾏编码,key 和 val 都进⾏了 URL 转码。
⼤部分服务端语⾔都对这种⽅式有很好的⽀持。
另外,如利⽤AJAX 提交数据时,也可使⽤这种⽅式。
例如 jQuery,Content-Type 默认值都是”application/x-www-form-urlencoded;charset=utf-8”。
⼆、multipart/form-data另⼀个常见的 POST 数据提交的⽅式, Form 表单的 enctype 设置为multipart/form-data,它会将表单的数据处理为⼀条消息,以标签为单元,⽤分隔符(这就是boundary的作⽤)分开,类似我们上⾯Content-Type中的例⼦。
由于这种⽅式将数据有很多部分,它既可以上传键值对,也可以上传⽂件,甚⾄多个⽂件。
当上传的字段是⽂件时,会有Content-Type来说明⽂件类型;Content-disposition,⽤来说明字段的⼀些信息。
每部分都是以 –boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(字段、⽂本或⼆进制等)。
如果传输的是⽂件,还要包含⽂件名和⽂件类型信息。
Http协议之请求头和响应头
Http请求头
Accept:客户机通过这个头,告诉服务器,它支持哪些数据类型
Accept-Charset::客户机通过这个头,告诉服务器,它支持的编码
Acceptቤተ መጻሕፍቲ ባይዱEncoding: 客户机通过这个头,告诉服务器,支持哪种数据压缩格式
Accept-Language: 客户机采用的是哪个语言
Connection:表示是否需要持久连接。
HTTP响应头
Location:服务器通过这个头告诉浏览器去访问哪个页面,这个头通常配合302状态码使用
server: 服务器通过这个头,告诉浏览器服务器类型
Content-Encoding: 服务器通过这个头告诉浏览器,回送的数据采用的压缩格式
ETag: W/"7777-1242234904000":缓存相关的头,为每一个资源配一个唯一的编号
Expires: 0 服务器通过这个头,告诉浏览器把会送的资源缓存多长时间,-1或0,则是不缓存
Cache-Control: no-cache
Pragma: no-cache
这三个头组合使用,让浏览器不要缓存数据
Content-Length: 服务器通过这个头告诉浏览器,回送的数据的大小长度
Content-Type: 服务器通过这个头告诉浏览器,回送数据的类型
Last-Modified: 服务器通过这个头告诉浏览器,缓存资源的最后修改时间
Refresh:服务器通过这个头告诉浏览器,定时刷新网页
Content-Disposition: attachment; filename=aaa.zip:服务器通过这个头告诉浏览器,以下载方式打开数据
HTTP协议header中Content-Disposition中文文件名乱码
HTTP协议header中Content-Disposition中⽂⽂件名乱码从跟踪代码来看,content-disposition存放的是http response的raw header。
直到在HttpContentDisposition类的filename_成员才会存放转换了的编码。
这个转换编码的猜测流程:asc,utf,有指定编码,按指定;否则按系统的字符集。
参考:https:///lc11535/article/details/100013653⽐如:“中⽂” 字符得编码:Unicode中为:4E2D 6587GBK(gb2312 gb18030)中为:D6D0 CEC4这是在内存中存放形式。
chrome内部统⼀⽤Unicode在内存存放,所以会有⼀张gbk到unicode得对照表,将“中”的 gbk D6D0 转换为 unicode的4E2D。
当需要把“中⽂”这两字保存到⽂件,或者⽹络传输时,直接保存需要两个字节,这样会浪费保存英⽂的存储空间,因为英⽂只需要⼀个字节。
所以这时就有个编码的需求。
⼀般都是⽤utf8。
英⽂直接还是⽤⼀个字节;中⽂就要⽤3个字节。
utf8,utf16,utf32都是对unicode的编码存储。
“中⽂”的utf8存成⽂件为:⽽“中⽂”的GBK存储时,直接就是按编码存储。
gb2312:规定:⼀个⼩于127的字符的意义与原来相同,但两个⼤于127的字符连在⼀起时,就表⽰⼀个汉字,前⾯的⼀个字节(他称之为⾼字节)从0xA1⽤到0xF7,后⾯⼀个字节(低字节)从0xA1到0xFE,这样我们就可以组合出⼤约7000多个简体汉字了gbk:只要⾼位是1开始,即⼤于127;不再管地位。
这样增加了2万汉字。
GB18030:加⼊了少数民族的字。
Unicode出现:所有字符都占两位wchar_t * p = L"Hello!" ;//占10个字节没有⼀种简单的算术⽅法可以把⽂本内容从UNICODE编码和另⼀种编码进⾏转换,这种转换必须通过查表来进⾏。
content-description讲解
`content-description` 是一个 HTTP 响应头字段,主要用于描述文档的内容。
它不是 MIME 类型的一部分,而是一个额外的元数据,可以帮助客户端更好地理解响应的内容。
在大多数情况下,`content-description` 字段是由服务器设置的,并包含有关响应内容的简短描述。
这个描述可以包含任何文本,但通常会使用简短的关键词或短语来概括响应的内容。
虽然 `content-description` 字段不是强制性的,但一些辅助技术(如屏幕阅读器)可能会使用这个字段来提供对内容的额外信息,以便更好地为用户服务。
需要注意的是,由于 `content-description` 是一个非标准的HTTP 头字段,因此并不是所有的 HTTP 客户端或服务器都会支持它。
在使用这个字段时,需要考虑到兼容性和可用性问题。
简述HTTP协议及抓包分析
1:HTTP请求头和响应头的格式1:HTTP请求格式:<request-line><headers><blank line>[<request-body>]说明:第一行必须是一个请求行(request-line),用来说明请求类型,要访问的资源以及所使用的HTTP版本.紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息.之后是一个空行.再后面可以添加任意的其他数据[称之为主体(body)].2:HTTP响应格式:<status-line><headers><blank line>[<response-body>]2:HTTP请求头和响应头各个字段的含义Http请求头Accept:客户机通过这个头,告诉服务器,它支持哪些数据类型Accept-Charset::客户机通过这个头,告诉服务器,它支持的编码Accept-Encoding: 客户机通过这个头,告诉服务器,支持哪种数据压缩格式Accept-Language: 客户机采用的是哪个语言Host:客户机通过这个头,告诉服务器,想访问服务器哪台主机If-Modified-Since:客户机通过这个头,告诉服务器,数据缓存的时间Referer:客户机通过这个头,告诉服务器,客户机是从哪个页面来的(防盗链)User-Agent: 说明客户机操作系统信息,以及浏览器信息Cookie:客户机通过这个头,可以带点数据给服务器Connection:表示是否需要持久连接。
HTTP响应头on:服务器通过这个头告诉浏览器去访问哪个页面,这个头通常配合302状态码使用server: 服务器通过这个头,告诉浏览器服务器类型Content-Encoding: 服务器通过这个头告诉浏览器,回送的数据采用的压缩格式Content-Length: 服务器通过这个头告诉浏览器,回送的数据的大小长度Content-Type: 服务器通过这个头告诉浏览器,回送数据的类型Last-Modified: 服务器通过这个头告诉浏览器,缓存资源的最后修改时间Refresh:服务器通过这个头告诉浏览器,定时刷新网页Content-Disposition: attachment; filename=aaa.zip:服务器通过这个头告诉浏览器,以下载方式打开数据ETag: W/"7777-1242234904000":缓存相关的头,为每一个资源配一个唯一的编号Expires: 0 服务器通过这个头,告诉浏览器把会送的资源缓存多长时间,-1或0,则是不缓存Cache-Control: no-cachePragma: no-cacheWireshark抓包分析请求方法:get统一资源标识符:/dsp/np?........... 请求版本:http/1.1用户能够接受的媒体格式:*/*用户的语言:中文用户代理:Mozilla编码方式:gzip更改日期:2015主机名:连接状态:已连接版本:http/1.1状态码:200响应片:ok连接编码:openresty 连接类型:image gif。
前端必备HTTP技能之HTTP请求头响应头中常用字段详解(转)
前端必备HTTP技能之HTTP请求头响应头中常⽤字段详解(转)作为⼀名前端开发⼈员,肯定少不了要和⽹络打交道,因为要从服务器端拉取数据,从服务端获取数据最常⽤的⽅式还是通过HTTP请求。
给服务器发请求的时候有请求头,接受服务器响应的时候有响应头,客户端和服务器端互相沟通需要的信息都是通过这些“头”来传送,这些信息是⼀些类似key:value的键值对。
了解这些“头”中字段的含义对于理解整个请求过程有很⼤的帮助。
这⾥列举了常⽤的“头”字段的解释以及例⼦,本⽂可以作为⼯具⽂收藏,以备需要时查看。
常⽤标准请求头字段Accept 设置接受的内容类型Accept: text/plainAccept-Charset 设置接受的字符编码Accept-Charset: utf-8Accept-Encoding 设置接受的编码格式Accept-Encoding: gzip, deflateAccept-Datetime 设置接受的版本时间Accept-Datetime: Thu, 31 May 2007 20:35:00 GMTAccept-Language 设置接受的语⾔Accept-Language: en-USAuthorization 设置HTTP⾝份验证的凭证Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==Cache-Control 设置请求响应链上所有的缓存机制必须遵守的指令Cache-Control: no-cacheConnection 设置当前连接和hop-by-hop协议请求字段列表的控制选项Connection: keep-aliveConnection: UpgradeContent-Length 设置请求体的字节长度Content-Length: 348Content-MD5 设置基于MD5算法对请求体内容进⾏Base64⼆进制编码Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==Content-Type 设置请求体的MIME类型(适⽤POST和PUT请求)Content-Type: application/x-www-form-urlencodedCookie 设置服务器使⽤Set-Cookie发送的http cookieCookie: $Version=1; Skin=new;Date 设置消息发送的⽇期和时间Date: Tue, 15 Nov 1994 08:12:31 GMTExpect 标识客户端需要的特殊浏览器⾏为Expect: 100-continueForwarded 披露客户端通过http代理连接web服务的源信息Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43Forwarded: for=192.0.2.43, for=198.51.100.17From 设置发送请求的⽤户的email地址From: user@Host 设置服务器域名和TCP端⼝号,如果使⽤的是服务请求标准端⼝号,端⼝号可以省略Host: :8080Host: If-Match 设置客户端的ETag,当时客户端ETag和服务器⽣成的ETag⼀致才执⾏,适⽤于更新⾃从上次更新之后没有改变的资源If-Match: "737060cd8c284d8af7ad3082f209582dIf-Modified-Since 设置更新时间,从更新时间到服务端接受请求这段时间内如果资源没有改变,允许服务端返回304 Not Modified If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMTIf-None-Match 设置客户端ETag,如果和服务端接受请求⽣成的ETage相同,允许服务端返回304 Not Modified If-None-Match: "737060cd8c284d8af7ad3082f209582d"If-Range 设置客户端ETag,如果和服务端接受请求⽣成的ETage相同,返回缺失的实体部分;否则返回整个新的实体If-Range: "737060cd8c284d8af7ad3082f209582d"If-Unmodified-Since 设置更新时间,只有从更新时间到服务端接受请求这段时间内实体没有改变,服务端才会发送响应If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMTMax-Forwards 限制代理或⽹关转发消息的次数Max-Forwards: 10Origin 标识跨域资源请求(请求服务端设置Access-Control-Allow-Origin响应字段)Origin: Pragma 设置特殊实现字段,可能会对请求响应链有多种影响Pragma: no-cacheProxy-Authorization 为连接代理授权认证信息Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==Range 请求部分实体,设置请求实体的字节数范围,具体可以参见HTTP/1.1中的Byte servingRange: bytes=500-999Referer 设置前⼀个页⾯的地址,并且前⼀个页⾯中的连接指向当前请求,意思就是如果当前请求是在A页⾯中发送的,那么referer就是A页⾯的url地址(轶事:这个单词正确的拼法应该是"referrer",但是在很多规范中都拼成了"referer",所以这个单词也就成为标准⽤法)Referer: /wiki/Main_PageTE 设置⽤户代理期望接受的传输编码格式,和响应头中的Transfer-Encoding字段⼀样TE: trailers, deflateUpgrade 请求服务端升级协议Upgrade: HTTP/2.0, HTTPS/1.3, IRC/6.9, RTA/x11, websocketUser-Agent ⽤户代理的字符串值User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0Via 通知服务器代理请求Via: 1.0 fred, 1.1 (Apache/1.1)Warning 实体可能会发⽣的问题的通⽤警告Warning: 199 Miscellaneous warning常⽤⾮标准请求头字段X-Requested-With 标识Ajax请求,⼤部分js框架发送请求时都会设置它为XMLHttpRequestX-Requested-With: XMLHttpRequestDNT 请求web应⽤禁⽤⽤户追踪DNT: 1 (Do Not Track Enabled)DNT: 0 (Do Not Track Disabled)X-Forwarded-For ⼀个事实标准,⽤来标识客户端通过HTTP代理或者负载均衡器连接的web服务器的原始IP地址X-Forwarded-For: client1, proxy1, proxy2X-Forwarded-For: 129.78.138.66, 129.78.64.103X-Forwarded-Host ⼀个事实标准,⽤来标识客户端在HTTP请求头中请求的原始host,因为主机名或者反向代理的端⼝可能与处理请求的原始服务器不同X-Forwarded-Host: :8080X-Forwarded-Host: X-Forwarded-Proto ⼀个事实标准,⽤来标识HTTP原始协议,因为反向代理或者负载均衡器和web服务器可能使⽤http,但是请求到反向代理使⽤的是httpsX-Forwarded-Proto: httpsFront-End-Https 微软应⽤程序和负载均衡器使⽤的⾮标准header字段 Front-End-Https: onX-Http-Method-Override 请求web应⽤时,使⽤header字段中给定的⽅法(通常是put或者delete)覆盖请求中指定的⽅法(通常是post),如果⽤户代理或者防⽕墙不⽀持直接使⽤put或者delete⽅法发送请求时,可以使⽤这个字段X-HTTP-Method-Override: DELETEX-ATT-DeviceId 允许更简单的解析⽤户代理在AT&T设备上的MakeModel/FirmwareX-Att-Deviceid: GT-P7320/P7320XXLPGX-Wap-Profile 设置描述当前连接设备的详细信息的xml⽂件在⽹络中的位置x-wap-profile: /uaprof/SGH-I777.xmlProxy-Connection 早起HTTP版本中的⼀个误称,现在使⽤标准的connection字段Proxy-Connection: keep-aliveX-UIDH 服务端深度包检测插⼊的⼀个唯⼀ID标识Verizon Wireless的客户X-UIDH: ...X-Csrf-Token,X-CSRFToken,X-XSRF-TOKEN 防⽌跨站请求伪造X-Csrf-Token: i8XNjC4b8KVok4uw5RftR38Wgp2BFwqlX-Request-ID,X-Correlation-ID 标识客户端和服务端的HTTP请求X-Request-ID: f058ebd6-02f7-4d3f-942e-904344e8cde5常⽤标准响应头字段Access-Control-Allow-Origin 指定哪些站点可以参与跨站资源共享Access-Control-Allow-Origin: *Accept-Patch 指定服务器⽀持的补丁⽂档格式,适⽤于http的patch⽅法Accept-Patch: text/example;charset=utf-8Accept-Ranges 服务器通过byte serving⽀持的部分内容范围类型Accept-Ranges: bytesAge 对象在代理缓存中暂存的秒数Age: 12Allow 设置特定资源的有效⾏为,适⽤⽅法不被允许的http 405错误Allow: GET, HEADAlt-Svc 服务器使⽤"Alt-Svc"(Alternative Servicesde的缩写)头标识资源可以通过不同的⽹络位置或者不同的⽹络协议获取Alt-Svc: h2=":443"; ma=7200Cache-Control 告诉服务端到客户端所有的缓存机制是否可以缓存这个对象,单位是秒Cache-Control: max-age=3600Connection 设置当前连接和hop-by-hop协议请求字段列表的控制选项Connection: closeContent-Disposition 告诉客户端弹出⼀个⽂件下载框,并且可以指定下载⽂件名Content-Disposition: attachment; filename="fname.ext"Content-Encoding 设置数据使⽤的编码类型Content-Encoding: gzipContent-Language 为封闭内容设置⾃然语⾔或者⽬标⽤户语⾔Content-Language: enContent-Length 响应体的字节长度Content-Length: 348Content-Location 设置返回数据的另⼀个位置Content-Location: /index.htmContent-MD5 设置基于MD5算法对响应体内容进⾏Base64⼆进制编码Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==Content-Range 标识响应体内容属于完整消息体中的那⼀部分Content-Range: bytes 21010-47021/47022Content-Type 设置响应体的MIME类型Content-Type: text/html; charset=utf-8Date 设置消息发送的⽇期和时间Date: Tue, 15 Nov 1994 08:12:31 GMTETag 特定版本资源的标识符,通常是消息摘要ETag: "737060cd8c284d8af7ad3082f209582d"Expires 设置响应体的过期时间Expires: Thu, 01 Dec 1994 16:00:00 GMTLast-Modified 设置请求对象最后⼀次的修改⽇期Last-Modified: Tue, 15 Nov 1994 12:45:26 GMTLink 设置与其他资源的类型关系Link: </feed>; rel="alternate"Location 在重定向中或者创建新资源时使⽤Location: /pub/WWW/People.htmlP3P 以P3P:CP="your_compact_policy"的格式设置⽀持P3P(Platform for Privacy Preferences Project)策略,⼤部分浏览器没有完全⽀持P3P策略,许多站点设置假的策略内容欺骗⽀持P3P策略的浏览器以获取第三⽅cookie的授权P3P: CP="This is not a P3P policy! See /support/accounts/bin/answer.py?hl=en&answer=151657 for more info." Pragma 设置特殊实现字段,可能会对请求响应链有多种影响Pragma: no-cacheProxy-Authenticate 设置访问代理的请求权限Proxy-Authenticate: BasicPublic-Key-Pins 设置站点的授权TLS证书Public-Key-Pins: max-age=2592000; pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g="; Refresh "重定向或者新资源创建时使⽤,在页⾯的头部有个扩展可以实现相似的功能,并且⼤部分浏览器都⽀持<meta http-equiv="refresh" content="5; url=/">Refresh: 5; url=/pub/WWW/People.htmlRetry-After 如果实体暂时不可⽤,可以设置这个值让客户端重试,可以使⽤时间段(单位是秒)或者HTTP时间Example 1: Retry-After: 120Example 2: Retry-After: Fri, 07 Nov 2014 23:59:59 GMTServer 服务器名称Server: Apache/2.4.1 (Unix)Set-Cookie 设置HTTP CookieSet-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1Status 设置HTTP响应状态Status: 200 OKStrict-Transport-Security ⼀种HSTS策略通知HTTP客户端缓存HTTPS策略多长时间以及是否应⽤到⼦域Strict-Transport-Security: max-age=16070400; includeSubDomainsTrailer 标识给定的header字段将展⽰在后续的chunked编码的消息中Trailer: Max-ForwardsTransfer-Encoding 设置传输实体的编码格式,⽬前⽀持的格式: chunked, compress, deflate, gzip, identity Transfer-Encoding: chunkedTSV Tracking Status Value,在响应中设置给DNT(do-not-track),可能的取值 "!" — under construction "?" — dynamic "G" — gateway to multiple parties "N" — not tracking "T" — tracking "C" — tracking with consent "P" — tracking only if consented "D" — disregarding DNT "U" — updatedTSV: ?Upgrade 请求客户端升级协议Upgrade: HTTP/2.0, HTTPS/1.3, IRC/6.9, RTA/x11, websocketVary 通知下级代理如何匹配未来的请求头已让其决定缓存的响应是否可⽤⽽不是重新从源主机请求新的Example 1: Vary: *Example 2: Vary: Accept-LanguageVia 通知客户端代理,通过其要发送什么响应Via: 1.0 fred, 1.1 (Apache/1.1)Warning 实体可能会发⽣的问题的通⽤警告Warning: 199 Miscellaneous warningWWW-Authenticate 标识访问请求实体的⾝份验证⽅案WWW-Authenticate: BasicX-Frame-Options 点击劫持保护: deny frame中不渲染 sameorigin 如果源不匹配不渲染 allow-from 允许指定位置访问 allowall 不标准,允许任意位置访问X-Frame-Options: deny常⽤⾮标准响应头字段X-XSS-Protection 过滤跨站脚本X-XSS-Protection: 1; mode=blockContent-Security-Policy, X-Content-Security-Policy,X-WebKit-CSP 定义内容安全策略X-WebKit-CSP: default-src 'self'X-Content-Type-Options 唯⼀的取值是"",阻⽌IE在响应中嗅探定义的内容格式以外的其他MIME格式X-Content-Type-Options: nosniffX-Powered-By 指定⽀持web应⽤的技术X-Powered-By: PHP/5.4.0X-UA-Compatible 推荐⾸选的渲染引擎来展⽰内容,通常向后兼容,也⽤于激活IE中内嵌chrome框架插件<meta http-equiv="X-UA-Compatible" content="chrome=1" />X-UA-Compatible: IE=EmulateIE7X-UA-Compatible: IE=edgeX-UA-Compatible: Chrome=1X-Content-Duration 提供⾳视频的持续时间,单位是秒,只有Gecko内核浏览器⽀持X-Content-Duration: 42.666Upgrade-Insecure-Requests 标识服务器是否可以处理HTTPS协议Upgrade-Insecure-Requests: 1X-Request-ID,X-Correlation-ID 标识⼀个客户端和服务端的请求X-Request-ID: f058ebd6-02f7-4d3f-942e-904344e8cde5像这种条⽬信息最佳的展⽰形式肯定是表格,但是markdown格式渲染出来的表格,在电脑上勉强可以看,⼿机根本⽆法阅读,主要是因为每个条⽬信息内容长度不⼀致,所以写的时候就没有使⽤表格,我在github上上传⼀个excel版本的http头字段的说明,查看起来⽐较清晰,本⼈有时查看某些头字段值时,都是⽤excel版本的,你可以点。
HTTP四种常见的POST提交数据方式
HTTP四种常见的POST提交数据⽅式最近学习接⼝知识和http协议,Http Header⾥的Content-Type⼀般有这三种:1. application/x-www-form-urlencoded:数据被编码为名称/值对。
这是标准的编码格式。
2. multipart/form-data:数据被编码为⼀条消息,页上的每个控件对应消息中的⼀个部分。
3. text/plain:数据以纯⽂本形式(text/json/xml/html)进⾏编码,其中不含任何控件或格式字符。
postman软件⾥标的是RAW。
定义和⽤法form表单中enctype 属性规定在发送到服务器之前应该如何对表单数据进⾏编码。
默认地,表单数据会编码为 "application/x-www-form-urlencoded"。
就是说,在发送到服务器之前,所有字符都会进⾏编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。
enctype属性值值描述application/x-www-form-urlencoded在发送前编码所有字符(默认)不对字符编码。
multipart/form-data在使⽤包含⽂件上传控件的表单时,必须使⽤该值。
text/plain空格转换为 "+" 加号,但不对特殊字符编码。
规定的 HTTP 请求⽅法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这⼏种。
其中 POST ⼀般⽤来向服务端提交数据,本⽂主要讨论 POST 提交数据的⼏种⽅式。
我们知道,HTTP 协议是以ASCII 码传输,建⽴在 TCP/IP 协议之上的应⽤层规范。
规范把 HTTP 请求分为三个部分:状态⾏、请求头、消息主体。
类似于下⾯这样:BASH<method> <request-URL> <version><headers><entity-body>协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使⽤什么编码⽅式。
HTTP协议的头信息详解
HTTP协议的头信息详解在数据挖崛方面有时候会经常分析网页内容,这时候就需要对HTTP协议有一定的了解,下边摘录了网上关于这方面的介绍HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP 协议的详细内容请参考RFC2616。
HTTP协议采用了请求/响应模型。
客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。
服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。
这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。
HTTP 的头域包括通用头,请求头,响应头和实体头四个部分。
每个头域由一个域名,冒号(:)和域值三部分组成。
域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
通用头域通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。
对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。
下面简单介绍几个在UPnP消息中使用的通用头域。
Cache-Control头域Cache -Control指定请求和响应遵循的缓存机制。
在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。
Content-type的说明即HTTP请求头的类型整理
Content-type的说明即HTTP请求头的类型整理要学习content-type,必须事先知道它到底是什么,是⼲什么⽤的。
HTTP协议(RFC2616)采⽤了请求/响应模型。
客户端向服务器发送⼀个请求,请求头包含请求的⽅法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。
服务器以⼀个状态⾏作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
通常HTTP消息由⼀个起始⾏,⼀个或者多个头域,⼀个只是头域结束的空⾏和可选的消息体组成。
HTTP的头域包括通⽤头,请求头,响应头和实体头四个部分。
每个头域由⼀个域名,冒号(:)和域值三部分组成。
域名是⼤⼩写⽆关的,域值前可以添加任何数量的空格符,头域可以被扩展为多⾏,在每⾏开始处,使⽤⾄少⼀个空格或制表符。
请求消息和响应消息都可以包含实体信息,实体信息⼀般由实体头域和实体组成。
实体头域包含关于实体的原信息,实体头包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。
Content-Type是返回消息中⾮常重要的内容,表⽰后⾯的⽂档属于什么MIME类型。
Content-Type: [type]/[subtype]; parameter。
例如最常见的就是text/html,它的意思是说返回的内容是⽂本类型,这个⽂本⼜是HTML格式的。
原则上浏览器会根据Content-Type来决定如何显⽰返回的消息体内容。
type有下⾯的形式Text:⽤于标准化地表⽰的⽂本信息,⽂本消息可以是多种字符集和或者多种格式的;Multipart:⽤于连接消息体的多个部分构成⼀个消息,这些部分可以是不同类型的数据;Application:⽤于传输应⽤程序数据或者⼆进制数据;Message:⽤于包装⼀个E-mail消息;Image:⽤于传输静态图⽚数据;Audio:⽤于传输⾳频或者⾳声数据;Video:⽤于传输动态影像数据,可以是与⾳频编辑在⼀起的视频数据格式。
关于http文件头的文档
深入理解HTTP消息头转载自:[](一)初识HTTP消息头但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。
做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。
HTTP传输的消息也是这样规定的,每一个HTTP包都分为HTTP头和HTTP体两部分,后者是可选的,而前者是必须的。
每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体,那么消息头又在哪呢?IE浏览器不让我们看到这部分,但我们可以通过截取数据包等方法看到它。
下面就来看一个简单的例子:首先制作一个非常简单的网页,它的内容只有一行:<html><body>hello world</body></html>把它放到WEB服务器上,比如IIS,然后用IE浏览器请求这个页面(http://localhost:8080/simple.htm),当我们请求这个页面时,浏览器实际做了以下四项工作:1 解析我们输入的地址,从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:协议名:http主机名:localhost端口:8080对象路径:/simple.htm2 把以上部分结合本机自己的信息,封装成一个HTTP请求数据包3 使用TCP协议连接到主机的指定端口(localhost, 8080),并发送已封装好的数据包4 等待服务器返回数据,并解析返回数据,最后显示出来由截取到的数据包我们不难发现浏览器生成的HTTP数据包的内容如下:GET /simple.htm HTTP/1.1<CR>Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,application/x-shockwave-flash, application/vnd.ms-excel,application/vnd.ms-powerpoint, application/msword, */*<CR>Accept-Language: zh-cn<CR>Accept-Encoding: gzip, deflate<CR>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<CR>Host: localhost:8080<CR>Connection: Keep-Alive<CR><CR>为了显示清楚我把所有的回车的地方都加上了“<CR>”,注意最后还有一个空行加一个回车,这个空行正是HTTP规定的消息头和消息体的分界线,第一个空行以下的内容就是消息体,这个请求数据包是没有消息体的。
.Net如何修改HttpHeaders中的Content-Disposition
.Net如何修改HttpHeaders中的Content-Disposition最近在看⼀些.Net5的内容,于是就想将之前Spring写的⼀个项⽬迁移到.Net上来看看。
不得不说.Net这⼏年发展的确实挺好的,超快的启动速度,极佳的性能让它⼀点不⽐Java差,但确实在国内⽣态有⼀些问题,⼀些问题的答案确实不那么好找,就⽐如我先在遇到的这个问题。
问题⼀:如何修改Content-Disposition属性⼀个简单下载查看⽂件的功能,我可以选择下载还是查看本地的⽂件,代码⾮常简单,就像这样:/// <summary>/// 加载⽂件/// </summary>/// <param name="path">⽂件路径</param>/// <param name="type">加载模式</param>/// <returns>⽂件</returns>[Route("file")][HttpGet]public async Task<IActionResult> DownloadFile(string path, string type){if (string.IsNullOrEmpty(path)){return Content("404 for not found!");}try{var filePath = PathFilterUtil.PathFilter(RUN_PATH, path);var memoryStream = new MemoryStream();using (var stream = new FileStream(filePath, FileMode.Open)){await stream.CopyToAsync(memoryStream);}memoryStream.Position = 0;// 获取⽂件的ContentTypestring fileExt = Path.GetExtension(path);var provider = new FileExtensionContentTypeProvider();var memi = provider.Mappings[fileExt];if (type == "inline"){Response.Headers.Add("Content-Disposition", $"inline; filename={Path.GetFileName(filePath)}");return File(memoryStream, memi, Path.GetFileName(filePath));}return File(memoryStream, memi, Path.GetFileName(filePath));}catch (DirectoryNotFoundException e){_logger.LogError($"⽂件:{path},没有找到!\n{e.Message}");return Content("404 for not found!");}}我需要修改HttpHeaders中Content-Disposition属性,将默认的attachment根据需要变成inline,但是我按照上⾯的说法,怎么都改不了它的Content-Disposition属性,不论则样它永远返回的是Content-Disposition: attachment; filename=appsettings.json; filename*=UTF-8''appsettings.json这样。
文件上传去除Content-Disposition:form-data
⽂件上传去除Content-Disposition:form-data某个项⽬中为了统⼀处理⽂件上传业务,创建了⼀个FileUpload Handle,由于上传客户端⽤到各种技术,当时为了⽅便断点续传,就直接接收请求中的⽂件内容(可能是分⽚),所以处理的不是规范的http请求,⼀直⼯作的很好,但是现在使⽤html代码上传⽂件时遇到了问题:服务接收到的⽂件中会多⼀个头和尾,原始内容如:Part,Product1,11,2服务端接收到的如:-----------------------------7e0bc1790bd2Content-Disposition: form-data; name="picture"; filename="C:\Users\ns56\Desktop\key_no.csv"Content-Type: application/vnd.ms-excelPart,Product1,11,2-----------------------------7e0bc1790bd2--由此可见html上传的是标准http请求,附带了⽂件信息,那么现在要做的就是去掉"Content-Disposition: form-data"经过分析只能使⽤Ajax来发送请求:<script>function doUpload() {$.ajax({url: 'http://',type: 'POST',data: document.getElementById('file1').files[0],async: false,cache: false,contentType: 'application/x-www-form-urlencoded',processData: false,success: function (returndata) {alert(returndata);},error: function (returndata) {alert(returndata);}});}</script>界⾯元素如下:<form id="uploadForm"><p>Pictures:<input type="file" name="picture" id="file1" /></p></form><input type="button" value="上传" onclick="doUpload()" />另附Angular⽂件上传代码:<div ng-app="DemoApp" ng-controller="DemoController"><span class="input-group-addon">File Path:</span><input type="file" id="file1" name="file1" neg-file-input ngf-select ng-model="file1" accept=".*" /><button type="button" ng-click="Upload()">Upload</button></div>JS部分:var app = angular.module('DemoApp', []);app.controller('DemoController', ['$scope', '$http', function ($scope, $http) {//为按钮定义函数$scope.Upload = function () {var file = document.getElementById("file1").files[0];$scope.UploadHeader = {headers: { 'Content-Type': 'application/x-www-form-urlencoded' }}$http.post("up.ashx", file, $scope.UploadHeader).success(function (returndata) {alert(returndata);}).error(function () {alert(returndata);});}}]);Handle部分:public void ProcessRequest(HttpContext context){using (var inputStream = context.Request.InputStream){string path = HttpContext.Current.Server.MapPath("UP");using (var flieStream = new FileStream(path + "/1.txt", FileMode.Create)) {inputStream.CopyTo(flieStream);}}context.Response.Write("ok");}。
利用response和HttP中的Content-Disposition:attachme。。。
利⽤response和HttP中的Content-Disposition:attachme。
中⽂名称的⽂件下载需要注意的问题:1、在设置response响应为Content-Disposition: attachment; filename=aaa.zip,通知浏览器以下载的⽅式处理服务器发来的数据。
2、对于中⽂名称的⽂件,需要利⽤URLEncoder.encode(filename,"utf-8"),对中⽂进⾏编码,即可完整的⽂件下载程序如下package com.baowei.servlet import java.io.FileInputStream;import java.io.FileNotFoundException;importjava.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .URLEncoder;import java.util.Properties;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.baowei.persondao.PersonDao;public class FristServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {fileDownload(resp);}private void fileDownload(HttpServletResponse resp) throws IOException {ServletContext context = this.getServletContext();String realpath = context.getRealPath("/哈哈.png");String filename = realpath.substring(stIndexOf("\\") + 1);System.out.println(filename);// resp.setContentType("image/png"); ,⽤于图⽚的显⽰//中⽂的⽂件名需要进⾏URLEncoder.encode(filename,"utf-8")的处理resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename,"utf-8"));FileInputStream is = new FileInputStream(realpath);byte[] buffer = new byte[1024];int len = 0;OutputStream out = resp.getOutputStream();while ((len = is.read(buffer)) != -1) {out.write(buffer, 0, len);}out.flush();is.close();}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当然filename参数可以包含路径信息,但User-Agnet会忽略掉这些信息,只会把路径信息的最后一部分做为文件名。当你在响应类型为 application/octet- stream情况下使用了这个头信息的话,那就意味着你不想直接显示内容,而是弹出一个”文件下载”的对话框,接下来就是由你来决定“打开”还是“保存” 了。
////attachment --- 作为附件下载
////inline --- 在线打开
HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
byte[] fileBuffer = new byte[fileSize];
将上述需求进行归我给出如下例子代码:
public static void ToDownload(string serverfilpath,string filename)
{
FileStream fileStream = new FileStream(serverfilpath, FileMode.Open);
w3c的说明:/Protocols/rfc2616/rfc2616-sec19.html
Content-Disposition的使用和注意事项
2008年08月27日 星期三 下午 07:21Content-Disposition的使用和注意事项
最近不少Web技术圈内的朋友在讨论协议方面的事情,有的说web开发者应该熟悉web相关的协议,有的则说不用很了解。个人认为这要分层次来看待这个问 题,对于一个新手或者刚入门的web开发人员而言,研究协议方面的东西可能会使得web开发失去趣味性、抹煞学习积极性,这类人应该更多的了解基本的 Web技术使用。而对于在该行业工作多年的老鸟来说,协议相关的内容、标准相关内容应该尽量多些的了解,因为只有这样才能使得经手的web系统更加优秀 (安全、漂亮、快速、兼容性好、体验好……)。本文我们来说一下MIME 协议的一个扩展Content-disposition。
Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。具体的定义如下
content-disposition = “Content-Disposition” “:”
disposition-type *( “;” disposition-parm )
fileStream.Read(fileBuffer, 0, (int)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
Hale Waihona Puke fileStream.Close();
HttpContext.Current.Response.End();
需要注意以下几个问题:
Content-disposition是MIME协议的扩展,由于多方面的安全性考虑没有被标准化,所以可能某些浏览器不支持,比如说IE4.01
我们可以使用程序来使用它,也可以在web服务器(比如IIS)上使用它,只需要在http header上做相应的设置即可
disposition-type = “attachment” | disp-extension-token
disposition-parm = filename-parm | disp-extension-parm
filename-parm = “filename” “=” quoted-string
Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)
{
return HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8);
}
简单的对上述代码做一下解析,ToDownload方法为将一个服务器上的文件(serverfilpath为服务器上的物理地址),以某文件名 (filename)在浏览器上弹出“文件下载”对话框,而ToOpen是将服务器上的某文件以某文件名在浏览器中显示/打开的。注意其中我使用了 UTF_FileName方法,该方法很简单,主要为了解决包含非英文/数字名称的问题,比如说文件名为“衣明志.doc”,使用该方法客户端就不会出现 乱码了。
}
public static void ToOpen(string serverfilpath, string filename)
{
FileStream fileStream = new FileStream(serverfilpath, FileMode.Open);
long fileSize = fileStream.Length;
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}
private static string UTF_FileName(string filename)
如:Response.AppendHeader("Content-Disposition","attachment;filename=MyExcel.xls");
python使用的一个例子:
print "Content-type: application/x-pcap";
print "Content-Disposition: attachment; filename=\"filename.pcap\"\n";
disp-extension-token = token
disp-extension-parm = token “=” ( token | quoted-string )
那么由上可知具体的例子:Content-Disposition: attachment; filename=“filename.xls”
long fileSize = fileStream.Length;
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + UTF_FileName(filename) + "\";");
我们在开发web系统时有时会有以下需求:
希望某类或者某已知MIME 类型的文件(比如:*.gif;*.txt;*.htm)能够在访问时弹出“文件下载”对话框
希望以原始文件名(上传时的文件名,例如:山东省政府1024号文件.doc)提供下载,但服务器上保存的地址却是其他文件名(如:12519810948091234_asdf.doc)
HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
byte[] fileBuffer = new byte[fileSize];
fileStream.Read(fileBuffer, 0, (int)fileSize);
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.AddHeader("Content-Disposition", "inline; filename=\"" + UTF_FileName(filename) + "\";");
希望某文件直接在浏览器上显示而不是弹出文件下载对话框
……………………
要解决上述需求就可以使用Content-disposition来解决。第一个需求的解决办法是
Response.AddHeader "content-disposition","attachment; filename=fname.ext"