大多数前端工程师对于这个multipart/form-data并不陌生,当我们需要发送二进制数据如图片时,通常会用到这个玩意儿~我们用form表单提交数据时,会指定form元素的enctype属性值为multipart/form-data,又或者使用html5新对象Formdata,我们用ajax发送数据时会指定content-type为multipart/form-data.

multipart/form-data数据格式

我们来看看这个multipart/form-data究竟有什么特别之处。

Content-Type:multipart/form-data; boundary=ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC

Host: w.sohu.com

--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC

Content-Disposition: form-data;name="desc"

Content-Type: text/plain; charset=UTF-8

Content-Transfer-Encoding: 8bit

[......][......][......][......]...........................

--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC

Content-Disposition: form-data;name="pic"; filename="photo.jpg"

Content-Type: application/octet-stream

Content-Transfer-Encoding: binary

[图片二进制数据]

--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC--

以上是截取了一个典型的multipart/form-data格式的http请求的部分,我们逐行来分析。

首先第一行,很简单,指定了Content-Type值,表明了这条http请求是multipart/form-data类型的。

细心的你可能发现了有一个名为boundary的玩意儿,它的值是一串看起来毫无规律的字符串。

先不急,我们来看一下具体的数据~分析数据我们可以看到刚才提到的boundary值在数据体中重复出现了多次。没错,这个boundary就是用来分割不同数据块的,当你提交这个请求后,后台会根据你在content-type中指定的boundary值来解析你的数据。

Content-Disposition用来表明该数据是表单数据,name用来说明这块数据块的名称,当是二进制数据时,你还需指定filename,即文件名。

multipart/form-data对数据格式要求非常严格,换行时必须使用\r\n,而不是\n,分隔符boundary在使用时,必须加上"--",即--boundary\r\n,数据体完结后,用--boundary--表明结束

稍微介绍了multipart/form-data的相关知识,我们现在进入重点:使用Lua来构造multipart/form-data格式的数据,并与webserver交互(在这里使用php)

我们需要使用到lua的一个模块,socket.http(安装引用不在本文讨论范围,请读者自行学习)

local resbody = {}

local reqfile= io.open(your-file-path)

local file_attr = lfs.attributes(your-file-path)

local size = file_attr.size --获取文件大小

local body, code, headers, status = http.request {

method = "POST",

url ='http://xxxx/upload.php',

headers = {

["Content-Type"] = "multipart/form-data",

["Content-Length"] = size

},

source = ltn12.source.file(reqfile),

sink = ltn12.sink.table(respbody)

}

注意,以上代码是我从stackoverflow上看到类似的,提问者自称能成功发送,但是这样的方式,在php里只能用file_get_contents( php://input )来获取原始数据流,但是$_POST和$_FILES数组拿不到你的数据,这显然不是我们想要的。

构造数据:

local respbody = {}

local _file = [[--abcd]]..'\r\n'..[[Content-Disposition: form-data; name="myfile"; filename="1.jpg"]]..'\r\n'..[[Content-Type: image/jpeg]]..'\r\n\r\n'

local _table1 = '\r\n'..[[--abcd]]..'\r\n'..[[Content-Disposition: form-data; name="type";]]..'\r\n\r\n'..[[0]]

local _table2 = '\r\n'..[[--abcd]]..'\r\n'..[[Content-Disposition: form-data; name="themeName";]]..'\r\n\r\n'..[[1482753000731]]

local _end ='\r\n'..[[--abcd--]]..'\r\n'

local reqfile= io.open(your-file-path)

local file_attr = lfs.attributes(your-file-path)

local size = file_attr.size

local body, code, headers, status = http.request {

method = "POST",

url = 'http://xxxx/upload.php',

headers = {

["Content-Type"] = "multipart/form-data;boundary=abcd",

["Content-Length"] = size+#_file+#_table1+#_table2+#_end

},

source = ltn12.source.cat(ltn12.source.string(_file),ltn12.source.file(reqfile),ltn12.source.string(_table1),ltn12.source.string(_table2),ltn12.source.string(_end)),

sink = ltn12.sink.table(respbody)

}

注意:我们这里进行了字符串块的拼接,ltn12.source.string()只能接受字符串块,这里的拼接过程中,换行符\r\n需要特别注意。

以上就是使用Lua构造multipar/form-data格式数据,并发送请求的全部内容,感谢阅读。

php http form的格式,multipart/form-data 格式的http请求,以及lua构造实现相关推荐

  1. request.form()和request()和request.data的区别

    Request.Form:获取以POST方式提交的数据(接收Form提交来的数据): Request.QueryString:获取地址栏参数(以GET方式提交的数据) Request:包含以上两种方式 ...

  2. form 中Enctype=multipart/form-data 的作用

    form 中Enctype=multipart/form-data 的作用 ENCTYPE="multipart/form-data"用于表单里有图片上传. <form na ...

  3. java form的时间格式_java date日期格式

    packagedateformat;import java.util.*;/*** Title: 日期转换函数 * Description: 有以下功能方法可以使用 * function 1:date ...

  4. ajax c 提交form,使用ajax提交form表单,包括ajax文件上传

    前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){ ... },"json"); 又或者是这样的aja ...

  5. 让WEB FORM更像WINDOWS FORM: 控制窗体事件

    [按] 你可能会误解本文标题:让WEB FORM 更像WINDOWS FORM. 你也许会把本文当作是讨论应用程序界面. 其实本文讨论的是ASP.NET表现层设计.  也许会给你一点启示:如何设计逻辑 ...

  6. C#窗口的Form.AcceptButton 属性和Form.CancelButton 属性

    C#窗口的Form.AcceptButton 属性和Form.CancelButton 属性 初入门时,看到这两个属性一般不太关注它,因为这两个属性在窗口设计上也不需要设置就可以工作,因为默认了按下回 ...

  7. python:微信支付链接转化成图片(data格式、PNG格式)

    微信支付的链接基本格式如下: weixin://wxpay/bizpayurl?pr=szIyqLmzz 拿到链接后,需要把它转成图片二维码,用来手机可扫描. import base64import ...

  8. Ext_单选框和复选框_Ext.form.Radio和Ext.form.Checkbox

    <mce:script type="text/javascript"><!-- /* Ext.form.Checkbox和Ext.form.Radio配置表: b ...

  9. Ext.form.TextField与Ext.form.TextArea

    个人的一些小错误,虽然对大多数人没啥帮助,就当是记录一下自己学习extjs的过程. Ext.form.TextField个人认为是单行文本域,就是不能换行的那种.项目需要文本框进行换行显示,找了好久也 ...

最新文章

  1. html怎么用chrome测试,通过chrome调试器测试了解浏览器解析和渲染HTML的过程
  2. Gartner Q2服务器市场报告5大要点
  3. 系统引导的过程一般包括如下几步: 【 】_20190317工控维修日记(西门子系统第二讲)...
  4. Spring Boot AOP 实现日志持久化
  5. 修改 (WSL)Windows Subsystem for Linux默认为root登录
  6. 数字电子技术基础第六版阎石王红课后答案
  7. 控制系统数字仿真-基于MATLAB实现四阶龙格库塔法
  8. 数学建模经验分享及比赛时间汇总
  9. 位置不可用——文件或目录损坏且无法读取
  10. OnTheHub 免费取得Offfice/Windows 正版序号,学生/教师限定
  11. 使用Tensorflow 2进行猫狗分类识别
  12. 在电脑上图片过长,但是要截成一张图片,解决方案
  13. 估值冰火两重天 互联网金融巨头“天价”冲刺上市
  14. vue 腾讯地图展示用户定位附近的门店
  15. 【毕业设计】后端实现——各个支付平台保存的账单分析与导入合并
  16. 幼儿拼图识字 v1.0 官网
  17. OpenBlas0.3.14编译
  18. mysql存储过程没有此表_mysql用存储过程写入 一个表A中没有存在在另一个表B的数据...
  19. 计算机软件著作权的价值,计算机软件著作权登记费是多少
  20. 【运维面试】面试官:reids和memcache的区别?

热门文章

  1. 【Unity2d】Sprite Renderer精灵渲染器
  2. Joan Ganz Cooney将接受IBC2018卓越国际荣誉奖
  3. Widget中的一些基本概念
  4. win10神州网信政府版系列设置(麦克风、摄像头、相机、屏幕保护时间)
  5. 蚂蚁分类信息系统伪静态规则设置教程
  6. android第三方打开文件,Android第三方文件选择器aFileChooser使用方法详解
  7. 根据哪些参数选择石英晶体谐振器
  8. STM32掌机教程2,掌机的原理
  9. 201671010412 郭佳 实验三 作业互评与改进
  10. 【Android】Android的应用架构