当前位置: 首页 > news >正文

HTTP 请求时传递多部分表单数据

HTTP 请求时传递多部分表单数据(multipart/form-data)

--data-raw $'------demo11111\r\nContent-Disposition: form-data; name="Filedata"; filename="截屏2025-02-27 15.45.46.png"\r\nContent-Type: image/png\r\n\r\n\r\n------demo11111\r\nContent-Disposition: form-data; name="type"\r\n\r\n5\r\n------demo11111--\r\n' 

--data-raw选项用于直接传递原始数据,而多部分表单数据格式通常用于上传文件或提交包含多种类型数据的表单

特殊符号解释

$
在 Bash 等 shell 中,$'...' 是一种 ANSI C 引号字符串的语法。这种语法允许在字符串中使用 C 风格的转义序列,比如 \r(回车符)、\n(换行符)、\t(制表符)等。例如,$'\r\n' 会被解释为回车换行符,这在多部分表单数据中是必要的,因为它遵循严格的换行格式要求。
\r\n
\r\n 是回车换行符,在 HTTP 协议和多部分表单数据中,它用于分隔不同的部分和字段。回车换行符是多部分表单数据格式的重要组成部分,用于明确每个字段和数据块的边界。

多部分表单数据结构分析

多部分表单数据由多个部分组成,每个部分之间用分隔符(这里是 ------demo11111)分隔,每个部分包含以下内容:
分隔符:用于区分不同的表单字段或文件
内容描述头:包含字段名、文件名、内容类型等信息
空行:由 \r\n 表示,用于分隔内容描述头和实际数据

数据内容:实际要上传的数据。

示例拆解

------demo11111
Content-Disposition: form-data; name="Filedata"; filename="截屏2025-02-27 15.45.46.png"
Content-Type: image/png

<文件内容>
------demo11111
Content-Disposition: form-data; name="type"

5
------demo11111--

第一部分:上传一个名为 截屏2025-02-27 15.45.46.png 的 PNG 图片,字段名为 Filedata
第二部分:上传一个名为 type 的字段,值为 5
结束标记:最后以 ------demo11111-- 表示表单数据结束

示例

假设要向 http://example.com/upload 发送上述多部分表单数据,完整的 curl 命令可能如下:

curl -X POST \
  --data-raw $'------demo11111\r\nContent-Disposition: form-data; name="Filedata"; filename="截屏2025-02-27 15.45.46.png"\r\nContent-Type: image/png\r\n\r\n<文件内容>\r\n------demo11111\r\nContent-Disposition: form-data; name="type"\r\n\r\n5\r\n------demo11111--\r\n' \
  http://example.com/upload

这样,curl 就会将多部分表单数据发送到指定的服务器地址

demo11111 是通用的吗?

并不是通用的

在使用多部分表单数据(multipart/form-data)进行文件上传或表单提交时,需要一个边界字符串(boundary string)来分隔不同的表单字段或文件数据。这个边界字符串是随机生成的,目的是确保它不会在表单数据中意外出现,从而避免混淆不同的部分。
不同的客户端(如浏览器、curl 等工具)在发起请求时,都会生成自己唯一的边界字符串。例如,在 Chrome 浏览器中,当使用 HTML 表单上传文件时,浏览器会自动生成一个边界字符串;使用 curl 时,如果手动指定多部分表单数据,也需要提供一个边界字符串,或者让 curl 自动生成。

非通用性原因

唯一性要求:为了准确区分多部分表单数据中的各个部分,边界字符串必须是唯一的。如果使用通用的边界字符串,那么在数据中就有可能意外出现与边界字符串相同的内容,导致服务器无法正确解析表单数据。

随机生成机制:不同的请求在不同的时间、不同的客户端发起,每次都会生成不同的边界字符串。例如,你在两次不同的 curl 请求中,生成的边界字符串大概率是不一样的。

bash
curl -X POST \
  --data-raw $'------WebKitFormBoundaryabc123\r\nContent-Disposition: form-data; name="Filedata"; filename="test.png"\r\nContent-Type: image/png\r\n\r\n<文件内容>\r\n------WebKitFormBoundaryabc123--\r\n' \
  http://example.com/upload

示例 2

curl -X POST \
  --data-raw $'------WebKitFormBoundaryxyz789\r\nContent-Disposition: form-data; name="Filedata"; filename="test2.png"\r\nContent-Type: image/png\r\n\r\n<文件内容>\r\n------WebKitFormBoundaryxyz789--\r\n' \
  http://example.com/upload

相关文章:

  • axios请求设置request umijopenai生产前端请求 ts状态全局 v-if v-else 与动态js变量
  • C#中的字典怎么使用?
  • Linux10-共享队列
  • android智能指针android::sp使用介绍
  • 工程化与框架系列(4)--Webpack 高级配置详解
  • 从ETL到数仓分层:大数据处理的“金字塔”构建之道
  • 【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)和CA(匀加速)
  • Vue程序下载
  • 大白话TypeScript第七章TypeScript 与不同技术栈的深度融合及拓展应用
  • 【Cadence仿真学习笔记】ADS Dynamic Link报错model is reserved的解决办法
  • vue3在使用ts为模板引用标注类型时,vue3.5+版本有了全新写法
  • conda怎么迁移之前下载的环境包,把python从3.9升级到3.10
  • 非关系型数据库和关系型数据库的区别
  • 2025年度福建省职业院校技能大赛高职组“信息安全管理与评估”赛项规程样题模块二
  • Nginx系列06(Nginx 缓存配置、SSL/TLS 配置)
  • DeepSeek + 自由职业 发现新大陆,从 0 到 1 全流程跑通商业 IP
  • UE5 Slate类的基础创建
  • 【docker】docker swarm lock和unlock的区别,以及旧节点重启的隐患
  • JavaWeb基础专项复习5——请求对象和响应对象request and response
  • 【江科大STM32】TIM输出比较-PWM功能(学习笔记)
  • 扁平化网站设计方案/全网整合营销推广系统
  • 做自己的网站能赚钱吗/免费换友情链接
  • 济南做网站费用/怎样利用互联网进行网络推广
  • 镇江seo公司/宣城网站seo
  • 网站做网络营销/文职培训机构前十名
  • 广州网站建设是什么/seo网络推广公司