http upload c 实现

前情提要

有时候就是要实现一些简单的 http 上传的功能,当然,没有加密。但是用库的话太大,同时有些环境下,没有那么大的空间移植一个库。

另一方面,也是一种学习,了解一下上传功能,到底协议是怎么做的。所以可能存在不足和错误,请多指教。

所以这里说说 http upload multipart 部分的协议,基于已经对 http 有一定了解的。

抓包分析流程

头部分析

POST /upload HTTP/1.1
Host: 192.168.5.180:12306
Referer: http://192.168.5.180:12306/upload
Origin: http://192.168.5.180:12306
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBb694xfiQO1GZfYc
User-Agent: cm
Content-Length: 9226


  • 这是一个简单的头部分抓包取出来的数据,有时候不需要写的特别全,主要依赖服务器的支持,当然全一些更规范。
  • POST /upload 服务器的目标上传路径
  • Content-Type 指定类型,上传文件一般就是 multipart/for-data
  • boundary= 数据部分的分割标识,一般开头要有几个--- ,至于多少,没研究,要看附件协议文档
  • Content-Length 数据总长度,这个是非头部分的余下实体内容的所有长度

内容分析

------WebKitFormBoundaryBb694xfiQO1GZfYc
Content-Disposition: form-data; name="uploadfile"; filename="v.txt"
Content-Type: application/octet-stream

t

------WebKitFormBoundaryBb694xfiQO1GZfYc
Content-Disposition: form-data; name="imei"

ab12348981724ies
------WebKitFormBoundaryBb694xfiQO1GZfYc
Content-Disposition: form-data; name="subid"

12
------WebKitFormBoundaryBb694xfiQO1GZfYc--

  • 这里只弄了一个最简单的文件做测试
  • 注意 boundary 分割部分,前面多加了个 --,这个是要注意的
  • 同时注意最后一个 boundary,在结尾加了个 -- ,这个也是要注意的,不注意看,或对详细很了解的,可能不会注意到这些问题
  • 多文件发送就如添加 uploadfile 一样,添加多个
  • 也可以按这种方式添加参数,imei, subid 就是这种方式来添加的,发送的内容是 text 文本,并非文件
  • 在发送第一个的时候,文件可能会很大,可以分段发送。
  • 注意 boundary 在每次发送都是要有的,在最后的时候也要发送最后一个 boundary 以示结束

实现部分

参考 https://gitee.com/jmdvirus/jkcommon.git,其中的 cm_http.c, cm_http_upload.c 部分,理解协议,实现就不是问题了

内容的发送,可以分段,也可以一起发送,用 tcp 发送,即可。

附件

  • jkcommon
  • [multipart rfc] (rfc2046)
  • [http1.1] rfc2616

你可能感兴趣的:(http upload c 实现)