HTTP协议之multipart/form-data请求分析

2023-11-17

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。

首先来了解什么是multipart/form-data请求:

根据http/1.1 rfc 2616的协议规定,我们的请求方式只有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等,那为为何我们还会有multipart/form-data请求之说呢?这就要从头来说了。

http协议大家都知道是规定了以ASCII码传输,建立在tcp、ip协议之上的应用层规范,规范内容把http请求分为3个部分:状态行,请求头,请求体。所有的方法、实现都是围绕如何运用和组织这三部分来完成的。换句话来说就是万变不离其中,只要我们了解了http请求的组成部分后,自然就可以应变任何实际工作中的需求和问题了。

关于状态行,请求头,请求体等三部分的具体内容,大家可以参考官方的协议文档http://www.faqs.org/rfcs/rfc2616.html,这里主要分析multipart/form-data请求具体是怎么一回事。

既然http协议本身的原始方法不支持multipart/form-data请求,那这个请求自然就是由这些原始的方法演变而来的,具体如何演变且看下文:

  • multipart/form-data的基础是post请求,即基于post请求来实现的
  • multipart/form-data形式的post与普通post请求的不同之处体现在请求头,请求体2个部分

multipart/form-data请求头:

必须包含Content-Type信息,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中不同参数的内容(普通post请求的参数分割符默认为&,参数与参数值的分隔符为=)。具体的头信息格式如下:

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

其中${bound} 是一个占位符,代表我们规定的具体分割符;可以自己任意规定,但为了避免和正常文本重复了,尽量要使用复杂一点的内容。如:--------------------56423498738365

样例:

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


multipart/form-data请求体:

它也是一个字符串,不过和普通post请求体不同的是它的构造方式。普通post请求体是简单的键值对连接,格式如下:

k1=v1&k2=v2&k3=v3

而multipart/form-data则是添加了分隔符、参数描述信息等内容的构造体。具体格式如下:

${bound}
Content-Disposition: form-data; name="Filename"

HTTP.pdf
${bound}
Content-Disposition: form-data; name="file000"; filename="HTTP协议详解.pdf"
Content-Type: application/octet-stream

%PDF-1.5
file content
%%EOF
${bound}
Content-Disposition: form-data; name="Upload"

Submit Query
${bound}--

其中${bound}就是之前请求头信息中的分割符,如果头信息中规定为123,那么这里也要为123(其作用等同于普通post请求中的&符号的作用,即分割参数)。很明显如果按照之前请求头的样例来,则这里的${bound}值应该替换为--------------------56423498738365,注意最后一个${bound}后需要固定添加两个横杆--

另外可以很容易的看出,这个请求体被分隔符划分为3个部分,而每个部分其实就是一个参数的键值描述(其作用等同于普通post请求的k1=v1的部分),但对参数信息的描述可以比普通post请求更加丰富,这就是为什么multipart/form-data能发送文件的原因。

每一个部分都是以分隔符开始的,接着是该部分内容的描述信息,然后是一个回车,最后是描述信息的具体内容。如果传送的内容是一个文件的话,那么还会包含文件名信息,以及文件内容的类型;上面的第二个小部分其实是一个文件体的结构,最后的分割符后会以--结尾,表示请求体结束。

综上,可以知道要发送一个multipart/form-data的请求,其实任何支持post请求的工具或语言都可以支持,只是自己要稍微包装一下便可。

 

参考资料:

百度百科: http://baike.baidu.com/view/9472.htm  

http1.1协议规范: http://www.faqs.org/rfcs/rfc2616.html

分析工具:httpAnalyzer

 

==========================纯文本格式分割线=========================

 

Header = {"Content-type" : "multipart/form-data, boundary=AaB03x"}

Data =	"--AaB03x\r\n" +
		"content-disposition: form-data; name=\"field1\"\r\n" +
		"\r\n" + 
		"Joe Blow\r\n" +
		"--AaB03x\r\n" +
		"content-disposition: form-data; name="pics"; filename=\"file1.txt\"\r\n" +
		"Content-Type: text/plain\r\n" +
		"\r\n" +
		"...binary contents of file1.txt ...\r\n" +
		"--AaB03x--\r\n"

其中:...binary contents of file1.txt ... 要替换成真实的文件二进制内容。

===========================请求代码分割线============================

 

 

如何使用Python发送multipart/form-data请求,请查看 http://blog.csdn.net/five3/article/details/74913742

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

HTTP协议之multipart/form-data请求分析 的相关文章

  • 过滤路径列表以仅包含文件

    如果我有一个清单FilePaths 如何过滤它们以仅返回常规文件 即不是符号链接或目录 例如 使用getDirectoryContents main do contents lt getDirectoryContents foo bar l
  • 如何从 Adob​​e AIR 中的文件流获取字节数组?

    我阅读的内容有限 小 15 500 mb 文件 我需要能够将所有文件字节放入一个字节数组中 所以我有一个功能 Bindable public var ba ByteArray new ByteArray code protected fun
  • 如果新文件不存在则写入新文件,如果存在则追加到文件

    我有一个程序可以写入用户的highscore到一个文本文件 该文件由用户选择时命名playername 如果具有该特定用户名的文件已经存在 那么程序应该附加到该文件 以便您可以看到多个highscore 如果具有该用户名的文件不存在 例如
  • 如何使用socket.io处理节点服务器上的并发文件写入请求

    如何使用 socket io 处理节点服务器上的并发文件写入请求 我用这个来写 fs writefile abc txt datatobewritten utf8 function err 我有一个文件 abc txt 假设两个用户尝试同时
  • php同时上传最大文件数

    我正在使用标签 用于使用 php 上传多个文件 我注意到 如果我选择超过 20 个文件 php 只会上传前 20 个文件 有没有办法扩大这个限制 这个限制被添加到PHP 5 2 12 https www php net releases 5
  • 是否可以合理地解决防病毒扫描工作目录的问题?

    我的 Win32 应用程序在运行时在指定的临时文件夹中执行大量磁盘操作 并且认真地重新设计它是不可能的 某些客户端具有扫描同一临时目录的防病毒软件 它只是扫描所有内容 我们试图说服他们禁用它 它不起作用 所以它也是不可能的 每隔一段时间 例
  • Byte[] 和 java.lang.OutOfMemoryError 按位读/写文件

    我正在努力擦除 Android 中的一些可用空间 这是我的代码 private void creatingFileDelete int size int passMode File lastFile new File Environment
  • 文件构造函数说明

    我无法理解以下文件构造函数 public File String parent String child and public File File parent String child 参数有什么作用parent and child该文件
  • 在 python 错误中,translate() 只接受一个参数(给定 2 个参数)

    import os import re def rename files get the files from dir file list os listdir r C OOP prank print file list saved pat
  • C++ 模板和头文件[重复]

    这个问题在这里已经有答案了 因此 我听说 C 模板不应分为头文件 h 和源文件 cpp 例如 这样的模板 template
  • 安卓写入文件

    经过几周的不编程之后 我决定完成我的应用程序 上次我无法进行文件写入和读取 现在我想做 我也许可以使用数据库 但这似乎容易得多 我已经发现this http narenst wordpress com 2010 01 25 android
  • System.IO.IOException:进程无法访问文件“.txt”,因为它正在被另一个进程使用

    我正在使用下一个代码来记录 Web 应用程序的错误 using StreamWriter myStream new StreamWriter sLogFilePath true myStream WriteLine string Forma
  • 读取多个文件 cotent 的 React JS

    我正在尝试使用 React js 读取多个文件 但我的代码只读取一个文件 而不会读取其余文件 有什么建议吗 Thanks constructor props super props this state files changedFileI
  • 使用 TcpClient 通过 C# 通过 TCP 发送多个文件

    我正在尝试使用 C TcpClient 通过 TCP 发送多个文件 对于单个文件来说它效果很好 但是当我有多个文件时 它只发送第一个文件 这是我的代码 发送文件 try TcpClient tcpClient new TcpClient N
  • 是否可以使用 Java 在文件上设置自定义元数据?

    是否可以在 File 实例上获取和设置自定义元数据 我想将通过系统处理的文件用作某种非常简单的数据库 其中每个文件都应包含其他自定义元数据 例如发件人的电子邮件 一些时间戳等 它是针对内部系统的 因此安全性不是问题 在 java 7 中你可
  • 打开/尝试读取文件[重复]

    这个问题在这里已经有答案了 我尝试简单地读取文本文件的内容并将其存储到数组中 但是 ins open file txt r array for line in ins array append line ins close 它给了我一个 打
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • 回形针不支持 .doc 文件

    在 Rails 4 0 2 中 我使用回形针 gem 上传文件 但它不支持 doc 文件 在文件上传字段下方 显示一条错误消息 扩展名与其内容不匹配 在模型中 检查内容类型的验证如下 validates attachment content
  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s

随机推荐

  • dialog弹窗表单居中

    内容居中只需要设置样式就可以了 不用太复杂了 el dialog body display inline block
  • Java操作json的通用类

    package com baiyyy polabs util json import java text ParseException import java util ArrayList import java util Date imp
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 云服务器+云数据库+WordPress搭建网站

    本文已在个人网站上发表 地址 http www bookmonster club 一 硬件环境 1 本地主机 window10系统 2 腾讯云服务器 Windows Server 2016 数据中心版 64位中文版 3 腾讯云数据库 Cyn
  • 知识越分享,收获越多。

    好处一 分享能更快地提升自己 分享知识对人是有考验的 因为做分享 首先要在脑袋里回顾 总结这个知识点 然后通过语言或文字表达出来 这个过程考验了对知识的掌握程度 可以增强我们的思考能力 语言表达能力和文字表达能力 很多时候 我们以为自己知道
  • ./configure: error: C compiler cc is not found

    CentOS 执行 configure 编译命令 时出现 checking for C compiler not found 解决方法 执行以下命令 yum y install gcc gcc c autoconf automake mak
  • dva中model中effect中获取state中的数据

    model export default modelExtend pageModel namespace storeIf state id effects update payload call put select const data
  • 如何快速确定程序的入口

    前言 在阅读代码时 知道程序的入口十分重要 这有助于快速理清程序的逻辑框架 我们找到程序入口后 顺着代码的执行顺序来阅读代码 可以比较容易的理解代码 这里说的代码是编译后成为可执行程序的代码 在linux中就是elf格式 被编译成可执行程序
  • 【学习笔记】模糊控制算法

    本文目录 0 前言 1 概述 2 模糊集合 2 1 集合和论域 2 2 模糊集合的概念 2 3 模糊集合的表示方式 2 4 模糊集合的运算 3 模糊关系与模糊关系合成 3 1 笛卡尔积 3 2 关系与模糊关系 3 3 模糊关系的运算 3 4
  • 自动生成代码的配置generator.properties

    u4EE3 u7801 u751F u6210 u5668 uFF0C u914D u7F6E u4FE1 u606F u5305 u540D package com zscat cms u4F5C u8005 author zscat E
  • python使用scipy.optimize的fsolve求解线性(非线性)方程

    文章目录 求解线性方程 求解非线性方程 求解线性方程 对于固定的线性方程 a 2b 0 4a 5b 0 求 a 与 b 使用如下方法 import scipy optimize as opt import numpy as np def f
  • 【JDK版本常见报错及其解决,Java基础知识点百度云

    J2SE 8 52 J2SE 7 jdk1 7 51 J2SE 6 0 jdk1 6 50 J2SE 5 0 jdk1 5 49 JDK 1 4 48 JDK 1 3 47 JDK 1 2 46 JDK 1 1 45 那怎么办 好办 把项目
  • 【链表】环型链表找环的起点

    力扣 142 环型链表 II 题目 给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环 则返回 null 1 先确定链表存在环 使用快慢指针法 分别定义 fast 和 slow 指针 从头结点出发 fast 指针每次
  • FFmpeg中的常见结构体

    代码基于FFmpeg5 0 1 目录 FFFormatContext AVFormatContext AVIOContext FFIOContext URLContext URLProtocol AVInputFormat FFStream
  • PAT甲级刷题:模拟(不断更新)

    目录 1001 A B Format 1005 Spell It Right 1035 Password 1061 Dating 18 20 1073 Scientific Notation 16 20 1077 Kuchiguse 17
  • Java 华为真题-猴子爬山

    需求 一天一只顽猴想去从山脚爬到山顶 途中经过一个有个N个台阶的阶梯 但是这猴子有一个习惯 每一次只能跳1步或跳3步 试问猴子通过这个阶梯有多少种不同的跳跃方式 输入描述 输入只有一个整数N 0
  • k8s中各组件和kube apiserver通信时的认证和鉴权

    背景 和master节点kube api server通信的组件有很多 包括 kubelet calico scheduler kubectl 某些pod可能会和kube api server通信 这些组件和api server通信时用的是
  • Springboot使用EasyExcel读写excel(详细)

    文章目录 使用EasyExcel读取Excel 一 关于EasyExcel 二 读取excel 实体类 本地读取 controller上传 创建监听器 三 导出excel 实体类 本地导出 Controller下载 使用EasyExcel读
  • 模糊pid控制的温度系统matlab源代码_模糊PID控制系统(一)模糊入门

    1 matlab模糊工具箱 1 1 matlab命令 fuzzy 打开fuzzy设计工具箱 1 2 添加输入输出 隶属度函数 数值范围 1 3 确定模糊规则表 添加模糊规则 也可在matlab 编辑器里编辑 fis文件 1 4 反模糊化 1
  • HTTP协议之multipart/form-data请求分析

    无意中发现了一个巨牛的人工智能教程 忍不住分享一下给大家 教程不仅是零基础 通俗易懂 而且非常风趣幽默 像看小说一样 觉得太牛了 所以分享给大家 点这里可以跳转到教程 首先来了解什么是multipart form data请求 根据http