65

我正在尝试开发一个侧边栏小工具,它可以自动检查网页以了解我的传输配额的演变过程。我快到了,但我需要最后一步才能让它工作:将带有正确 POST 数据的 HttpRequest 发送到 php 页面。使用 firefox 插件,标题的“Content-Type”如下所示:

Content-Type=multipart/form-data; boundary=---------------------------99614912995

参数“边界”似乎是随机的,而 POSTDATA 是这样的:

POSTDATA =-----------------------------99614912995
Content-Disposition: form-data; name="SOMENAME"

Formulaire de Quota
-----------------------------99614912995
Content-Disposition: form-data; name="OTHERNAME"

SOMEDATA
-----------------------------99614912995--

我不明白如何正确模拟 POSTDATA 并返回神秘的“边界”参数。

有人知道我该如何解决这个问题吗?

4

3 回答 3

82

引用RFC 1341,第 7.2.1 节,我认为是标头boundary参数上的相关位Content-Type(对于 MIME):

“multipart”的所有子类型共享一个共同的语法......

多部分实体的 Content-Type 字段需要一个参数“boundary”,用于指定封装边界。封装边界定义为一行完全由两个连字符(“-”,十进制代码 45)组成,后跟来自 Content-Type 头字段的边界参数值。

然后澄清:

因此,典型的多部分 Content-Type 标头字段可能如下所示:

 Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p

这表明实体由几个部分组成,每个部分本身的结构在语法上与 RFC 822 消息相同,除了标题区域可能完全为空,并且每个部分前面都有 --gc0p4Jq0M2Yt08jU534c0p 行

注意事项:

  1. 封装边界必须出现在一行的开头,即在 CRLF(回车换行)之后
  2. 边界必须紧跟另一个 CRLF 和下一部分的标头字段,或者是两个 CRLF,在这种情况下,下一部分没有标头字段(因此假定为 Content-Type text/清楚的)。
  3. 封装边界不得出现在封装内,且不得超过 70 个字符,不包括两个前导连字符。

最后但并非最不重要的:

最后一个正文部分之后的封装边界是一个显着的分隔符,表示后面不会有其他正文部分。这样的分隔符与前面的分隔符相同,只是在行尾添加了两个连字符:

 --gc0p4Jq0M2Yt08jU534c0p-- 

我希望这对将来的其他人有所帮助,因为我必须漫游一段时间才能获得全貌(请确保阅读必要的 RFC 以获得最深入的理解)。

于 2012-06-07T13:12:28.210 回答
43

边界参数设置为多个连字符加上末尾的随机字符串,但您可以将其设置为任何值。问题是,如果边界字符串出现在请求数据中,它将被视为边界。

有关一些提示和发送 multipart/form-data 的示例函数,请参阅我对这个问题的回答。修改该函数以对您要发送的每个部分使用循环并不难。

于 2010-02-21T11:02:22.813 回答
6

multipart/form-data 的实际规范在RFC 7578中。边界在第 4.1 节中定义。

于 2010-02-21T08:32:21.830 回答