当前位置: 首页 > 知识库问答 >
问题:

当用cURL PHP制作HTTP原始POST请求多部分/表单数据时,如何正确设置内容长度头?

耿和韵
2023-03-14

例如,我有一个PHP脚本,它使curl POST将图像上传到服务器,请求的HTTP实体主体的内容如下所示:

------Boundary123
Content-Disposition: form-data; name="files[]"; filename="image.png"
Content-Type: image/png

... contents of image.png
------Boundary123--

我这样做:

 $bodiEntity = "--".$boundary."\r\n".
               'Content-Disposition: form-data; name="files[]"; filename="'.$fileName.'"'."\r\n".
               'Content-Type: img/png'."\r\n\r\n".
                file_get_contents($fileName)."\r\n". // binary contents of file
                "--".$boundary."--\r\n";

但是,我应该为Content-Length标头设置哪个值呢?我知道,它是实体体的字节数,但是我应该如何处理“\r\n”呢?我的意思是,如果我执行strlen(“\r\n”),我会得到2作为返回值,但我想在处理发送多部分/表单数据时,它应该是1(意味着)一个字节,对吗?

共有1个答案

姜旭
2023-03-14

将“\r\n”计数为两个字节。CRLF对有两个字节长。整个身体包括

 - the boundary prefix ("--"), 
 - boundary, 
 - the content bytes, 
 - the interim boundaries and their prefixes, 
 - the final boundary prefix, 
 - boundary and boundary post fix,

所有这些都应该在内容长度中说明。

至于内容--长度。从HTTP 1.1开始,没有为多部分请求中的每个文件部分定义内容长度。

但是,总内容长度头应该在请求的开头定义。您可能希望阅读RFC7230第3.3.2节。它是由web和HTTP标准的主要作者之一Roy Thomas Fielding编写的。

但是有许多其他的方法可以将文件作为请求发送,它不一定需要在基于边界的多部分请求中被限制。POST方法本身的另一种机制是原始内容类型html" target="_blank">请求。内容是在请求中的头结束后传输的,后面是一个空行(读“\r\n”)。

其他机制包括PUT请求,它也可以以类似的方式工作。从技术上讲,这两个问题都有不同之处,使它们相距甚远,尽管我不认为深入这个细节与这个问题有任何关系,所以我就跳过它。

 类似资料:
  • 问题内容: 我正在尝试通过带有POST请求的照片上传 根据自述文件,我应该能够做到这一点 问题是,这不起作用。我收到测试服务器的回复,说它转储了0个post变量。 我已经确认该HTML小页面服务器处于工作状态 所以问题是,请求模块在做什么?有没有更好的方法来发送节点? 问题答案: 经过更多研究后,我决定使用。这使得分段上传非常容易。

  • 我试图计算http post请求的请求体的内容长度,但我不断得到错误,表明内容长度错误。请求正文如下所示: 我尝试了两种解决方案,比如将正文的内容连接成一个字符串,比如following,然后将其转换成字节数组并发送其长度,但没有成功。 帖子请求正文是x-wow-form-urlencoded格式,内容长度必须正确计算。任何帮助都很感激,谢谢。

  • 问题内容: 在Apache Commons HttpClient的3.x版本中,可以进行multipart / form-data POST请求(2004年的示例)。不幸的是,这在HttpClient的4.0版本中不再可能。 对于我们的核心活动“ HTTP”,多部分内容超出了范围。我们很乐意使用由其他项目维护的多部分代码,但我对此一无所知。几年前,我们曾尝试将多部分代码移至commons编解码器,

  • 我有下面的代码发送一个多部分/表单数据请求。 在我的RestClient类中,我使用下面几行代码使用JAX-RS客户机对象发送POST请求 我使用Wiremock检查了HTTP请求主体,如下所示: 我想知道请求负载中的内容长度标头是如何丢失的。有没有办法设置请求的内容长度标头? 请帮帮我。

  • 我的HTTP头有问题。我需要发送一个带有空正文和标题“content-length:0”的post-request。但这似乎是不可能的,因为我有一个例外: --org.apache.http.ProtocolException:内容长度头已存在-- 编辑: 用@Beno Arakelyan的答案解决了这个问题。

  • 问题内容: 我在用Java应用程序服务器处理multipart / form-data请求时非常困难。从我发现的情况来看,servlet 3.0规范提供了诸如HttpServletRequest.getParts()之类的方法,这对于处理上传到我的servlet的表单数据是理想的。 但是,此方法是3.0 Servlet规范的一部分,并且我的应用程序服务器(Tomcat 6)尚不支持此方法。即使具有