multipart/form-data (一种POST 数据提交的方式)

2023-10-27

一、初识multipart/form-data

enctype属性:

enctype:规定了form表单在发送到服务器时候编码方式,它有如下的三个值。

  • application/x-www-form-urlencoded:默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下。
  • multipart/form-data指定传输数据为二进制类型,比如图片、mp3、文件。
  • text/plain:纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。

二、multipart/form-data请求请求体的格式

  multipart/form-data是基于post方法来传递数据的,并且其请求内容格式为Content-Type: multipart/form-data,用来指定请求内容的数据编码格式。另外,该格式会生成一个boundary字符串来分割请求头与请求体的,具体的是以一个boundary=${boundary}来进行分割,伪码如下:

...
Content-Type: multipart/form-data; boundary=${boundary} 

--${boundary}
...
...

--${boundary}--

  上面boundary=${boundary}之后就是请求体内容了,请求体内容各字段之间以--${boundary}来进行分割,以--${boundary}--来结束请求体内容。

例子:

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png

PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

数据包说明

  首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 multipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。关于 multipart/form-data 的详细定义,可在 rfc1867 查看。

  这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。

具体传递过程

  由于是POST请求,参数一般是以key-value的json字符串传递,或者将参数放入map传递。我们可以看到很多name,这个name就是key,下面的数据就是value,我们可以提取所有的key及value组成一个json字符串或者map传递即可。

提取出的json字符串类似于下面字段所示(非以上数据包提取,源自:如何传递Request PayLoad(请求负载)中的数据):

{"view:id1:txtSearch":"","$$viewid":"!f9fpyhcv2t!","$$xspsubmitid":"view:_id1:_id2:pager1_Group_lnk_2","$$xspexecid":"view:_id1:_id2:parent","$$xspsubmitvalue":"","$$xspsubmitscroll":"0|0","view:_id1":"view:_id1"}

或者map形式

            Map<String,String> m = new HashMap<String,String>();
            m.put("view:id1:txtSearch", "");
            m.put("$$viewid", "!f9fpyhcv2t!");
            m.put("$$xspsubmitid", "view:_id1:_id2:pager1_Group_lnk_2");
            m.put("$$xspexecid", "view:_id1:_id2:parent");
            m.put("$$xspsubmitvalue", "");
            m.put("$$xspsubmitscroll", "0|0");
            m.put("view:_id1", "view:_id1");


三、文中相关名词:

  • boundary属性
    根据RFC 1867定义,我们需要选择一段数据作为“分割边界”( boundary属性),这个“边界数据”不能在内容其他地方出现,一般来说使用一段从概率上说“几乎不可能”的数据即可。 不同浏览器的实现不同,每次post浏览器都会生成一个随机的30-40位长度的随机字符串,浏览器一般不会遍历这次post的所有数据找到一个不可能出现在数据中的字符串,这样代价过大,一般都是随机生成。
    Rfc1867这样说明{A boundary is selected that does not occur in any of the data. (This selection is sometimes done probabilisticly.)}。

(待更新)

参考:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

multipart/form-data (一种POST 数据提交的方式) 的相关文章

随机推荐

  • 平面几何-python

    三角形面积 题目描述 平面直角坐标系中有一个三角形 请你求出它的面积 输入描述 第一行输入一个 TT 代表测试数据量 每组测试数据输入有三行 每行一个实数坐标 x y x y 代表三角形三个顶点 1 T 10 3 10 5 x y 10 5
  • 2018年LeetCode高频算法面试题刷题笔记——验证回文串(字符串)

    1 解答之前的碎碎念 这个题还蛮简单的 大概就是考研机试第一题的水平 所以就不写解法了 2 问题描述 给定一个字符串 验证它是否是回文串 只考虑字母和数字字符 可以忽略字母的大小写 说明 本题中 我们将空字符串定义为有效的回文串 示例 1
  • 自媒体账号ID应该怎么取?

    我们都知道 在做自媒体之前 我们需要注册自媒体账号 这时候我们需要给账号取一个名称 一个好的名称能让你吸取更多的粉丝 让读者记忆深刻 取名规范各平台的规则都差不多 所以在入驻平台之前一定要先认真看清各平台名称规范 防止因为名称不规范而不能通
  • 鹏仔暴力刷导航网页排行榜HTML模板,网站如何测压

    现在很多站长都做了导航站 大多数导航站都有网站排行榜 也就是今日浏览榜 月最高浏览榜 总浏览榜等 你页面阅读量越高 那么排名越靠前 曝光的几率就更高 很多站长在某些导航站提交完收录后 手动刷新增加阅读量 真的特别慢 那么本次鹏仔就给大家简单
  • 头文件路径包含问题

    头文件包含两种 系统头文件和自定义头文件 系统头文件不说了 格式统一 自定义头文件在包含的时候要注意路径 其实是头文件与主文件的相对位置关系的问题 ps 另外 LInux和Windows下也有所区别 举4个例子 应该就能看明白了 一 这种情
  • InnoSetup 脚本打包及管理员权限设置

    InnoSetup使用教程 InnoSetup打包安装 脚本详细 1 定义变量 1 define MyAppName TranslationTool 2 define MyAppChineseName 翻译工具 3 define MyApp
  • ios系统下input边框有默认阴影

    修复代码 1 input outline none webkit appearance none 去除系统默认的样式 webkit tap highlight color rgba 0 0 0 0 点击高亮的颜色 2 input appea
  • 深度学习实战11(进阶版)-BERT模型的微调应用-文本分类案例

    文章目录 一 前期工作 导入库包 导入数据 二 模型加载三 模型训练 四 模型测试 大家好 我是微学AI 今天给大家带来一个基于BERT模型做文本分类的实战案例 在BERT模型基础上做微调 训练自己的数据集 相信之前大家很多都是套用别人的模
  • 选择正确的DDoS解决方案:按需云服务

    迁移到云端的优势 与部署独立硬件设备相比 迁移到云端有许多优势 保护基于云的应用程序 托管在云中的应用程序无法通过本地设备保护 因此需要基于云的保护 更大容量 随着容量 DDoS 攻击变得越来越大 许多攻击很容易超过典型企业级 DDoS 缓
  • java HashSet 如何判断元素是否存在

    HashSet不能添加重复的元素 当调用add Object 方法时候 首先会调用Object的hashCode方法判hashCode是否已经存在 如不存在则直接插入元素 如果已存在则调用Object对象的equals方法判断是否返回tru
  • Spring 中的Advice类型介绍

    Spring 中的 Advice 类型介绍 翻译原文链接 Introduction to Advice Types in Spring 1 概述 在本文中 我们将讨论可以在 Spring 中创建的不同类型的 AOP 通知 In this a
  • javaweb:监听域对象创建和销毁的Listener

    1 什么是Servlet监听器 先来看看什么是监听器 监听器是专门用于对其它对象身上发生的事件或状态改变进行监听和相应处理的对象 当被监视的对象发生情况时立即采取相应的行动 Servlet监听器是Servlet规范中定义的一种特殊类 它用于
  • ubuntu安装code

    进入链接 http code visualstudio com下载 deb 在下载好的文件处终端输入sudo dpkg i code xxx
  • sklearn 数据处理与特征工程

    1 数据处理的流程 2 数据预处理 Preprocessing Impute 2 1 数据无量纲化 在机器学习算法实践中 我们往往有着将不同规格的数据转换到同一规格 或不同分布的数据转换到某个特定分布的需求 这种需求统称为将数据 无量纲化
  • java对list分组_Java List排序,分组等操作

    假定有一列实体类对像 List list UserServer getList 去重 去除重复对象 每个属性的值都一样的 需要注意的是要先重写对象User的equals和hashCode方法 List distinctList list s
  • 冒泡排序,快速排序,选择排序详细过程

    一 冒泡排序 1基本思想 相邻的两个数之间进行比较 按照规则进行交换 2 实现思路 以升序排列为例 第一趟比较 先用第一个和第二个元素进行比较 将较大的交换到第二个位置上 然后第二个和第三个进行比较 将较大的放在第三个位置上 依次类推 第一
  • 宝藏软件Obsidian知识体系搭建,免费的多端云同步

    宝藏软件Obsidian知识体系搭建 免费的多端云同步 为什么推荐Obsidian 人很奇怪 在关注短期目标的时候 会有成功失败之说 但是如果关注体系呢 就不那么会在乎短期收益了 为什么呢 因为体系可能会创造强大的滚雪球效应 使用笔记软件颇
  • Blender设置相机围绕物体旋转

    以下内容参考视频 https www bilibili com video BV1X7411g75c 1 首先随便添加一个物体 选中摄像机 位置 旋转归零 缩放归一 这一步不能少 快捷键 位置归零 Alt G 旋转归零 Alt R 缩放归一
  • C语言创建多线程

    线程是计算机中独立运行的最小单位 每个线程占用的CPU时间是由系统分配的 因此可以把线程看成操作系统分配CPU时间的基本单位 每个线程只有在系统分配给它的时间片内才能取得CPU控制权 执行线程中的代码 Linux操作系统在一个进程内生成多个
  • multipart/form-data (一种POST 数据提交的方式)

    一 初识multipart form data enctype属性 enctype 规定了form表单在发送到服务器时候编码方式 它有如下的三个值 application x www form urlencoded 默认的编码方式 但是在用