您当前的位置: 首页 >  ar

插件开发

暂无认证

  • 5浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

libcurl-上传文件API-http工作原理-curl_mime_init-curl_mime_addpart-curl_mime_name-curl_mime_data

插件开发 发布时间:2022-06-18 08:00:00 ,浏览量:5

文章目录
    • 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.作者答疑

1.上传文件工作原理

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-urlencoded

HTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面,注意如果是中文或特殊字符如"/“、”,“、“:” 等会自动进行URL转码。不支持文件,一般用于表单提交。

1.3.multipart/form-data

与application/x-www-form-urlencoded不同,这是一个多部分多媒体类型。首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以------boundary–为结束标识。multipart/form-data支持文件上传的格式,一般需要上传文件的表单则用该类型。 下面是一个例子: 在这里插入图片描述

1.4.application/json

JSON 是一种轻量级的数据格式,以“键-值”对的方式组织的数据。这个使用这个类型,需要参数本身就是json格式的数据,参数会被直接放到请求实体里,不进行任何处理。服务端/客户端会按json格式解析数据(约定好的情况下)。 在这里插入图片描述

1.5.上传文件报文范例
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&..;..            
关注
打赏
1665481431
查看更多评论
0.1188s