- 1.上传文件工作原理
- 1.1.Content-Type 请求头报头域
- 1.2.application/x-www-form-urlencoded
- 1.3.multipart/form-data
- 1.4.application/json
- 1.5.上传文件报文范例
- 2.curl_mime_init - 创建一个 mime 句柄
- 2.1.原理解析
- 2.2.简单范例
- 3.curl_mime_addpart - 将新的空白部分附加到 mime 结构
- 3.1.原理解析
- 3.2.简单范例
- 4.curl_mime_name - 设置 mime 部分的名称
- 5.curl_mime_data - 从内存中设置 mime 部分的主体数据
- 6.curl_mime_filename - 设置 mime 部分的远程文件名
- 6.1.原理解析
- 6.2.简单范例
- 7.curl_mime_filedata - 从文件内容中设置 mime 部分的主体数据
- 7.1.原理解析
- 7.2.简单范例
- 8.curl_mime_type - 设置 mime 部分的内容类型
- 8.1.原理解析
- 8.2.简单范例
- 9.curl_mime_filedata - 从文件内容中设置 mime 部分的主体数据
- 10.作者答疑
http协议是应用层规范。http请求分为3个部分:状态行,请求头,请求体。所有的方法、实现,都是围绕 “如何运用和组织这三部分” 来完成的。http里没有专门用于文件上传的请求方式,文件上传请求是在post请求基础之上定义出来的一种方式。http协议规定 POST 请求提交的数据,必须放在请求体(entity-body)中,但协议并没有规定编码方式 。开发者可以自己决定编码格式,只要最后发送的 HTTP 请求,满足上面的格式就可以。
1.1.Content-Type 请求头报头域Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型。在互联网中有成百上千中不同的数据类型,HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签,用于区分数据类型。最初MIME是用于电子邮件系统的,后来HTTP也采用了这一方案。在HTTP协议消息头中,使用Content-Type来表示请求和响应中的媒体类型信息。它用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html等等。
Content-Type的格式:Content-Type:type/subtype ;parameter type:主类型,任意的字符串,如text,如果是号代表所有; subtype:子类型,任意的字符串,如html,如果是号代表所有,用“/”与主类型隔开; parameter:可选参数,如charset,boundary等。 例如: Content-Type: text/html; Content-Type: application/json;charset:utf-8;
1.2.application/x-www-form-urlencodedHTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面,注意如果是中文或特殊字符如"/“、”,“、“:” 等会自动进行URL转码。不支持文件,一般用于表单提交。
1.3.multipart/form-data与application/x-www-form-urlencoded不同,这是一个多部分多媒体类型。首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以------boundary–为结束标识。multipart/form-data支持文件上传的格式,一般需要上传文件的表单则用该类型。 下面是一个例子:
JSON 是一种轻量级的数据格式,以“键-值”对的方式组织的数据。这个使用这个类型,需要参数本身就是json格式的数据,参数会被直接放到请求实体里,不进行任何处理。服务端/客户端会按json格式解析数据(约定好的情况下)。
POST /xxx HTTP/1.1
Host: hello.app
Connection: keep-alive
Content-Length: 3695
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://hello.app
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36
Content-Type: multipart/form-data;boundary=----WebKitFormBoundaryIZDrYHwuf2VJdpHw
Referer: http://hello.app/formtest.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
------WebKitFormBoundaryIZDrYHwuf2VJdpHw
Content-Disposition: form-data; name="name"
"hello world"
------WebKitFormBoundaryIZDrYHwuf2VJdpHw
Content-Disposition: form-data; name="file"; filename="temp.png"
Content-Type: image/png
.PNG
.
...
IHDR...
..........Y../..,+|.$aIk.v...G?...P.P,,...m..e.2....v.7. pHYs...%...%.IR$....|IDAT(.cTT....................:.?.......}.(.Pd`A..V...L...?..#.....4.o..LS.....W.d.?...A8..LS...(.u.......D.b......b.....o&..;..
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?