如何处理 PHP 请求中的长标头声明?
Posted
技术标签:
【中文标题】如何处理 PHP 请求中的长标头声明?【英文标题】:How can I handle long header declarations in PHP requests? 【发布时间】:2011-05-23 17:42:34 【问题描述】:我正在尝试使用Picasa Web Uploader API 将照片库上传到我的网站。我已经能够实现该按钮,在 Picasa 中对其进行设置并进行身份验证,但是在处理我的网站从 Picasa 收到的 POST 时,$_FILES
数组始终为空。
我查看了 Picasa 使用 Fiddler 发布的请求,并且能够确定每个文件多部分开头的 Content-Disposition
标头是 too long - Picasa 发送的标头包括我服务器上文件的完整路径,因此它最终远远超过 128 个字符:
Content-Disposition: form-data; name="http://localhost:50216/1f6b3b29edc6f9d8898ede07c1b10e27/image/415603f72f75af1a.jpg?size=640"; filename="DSC_0055.JPG"
似乎 php 只能处理最多 128 个字符的标题,如果标题太长,整个多部分部分将被丢弃。 (当我在 Fiddler 中减少此标头的长度并重新发布请求时,我的网站会收到 $_FILE
并成功处理。
我该如何解决这个问题?
我可以在某处设置配置设置以允许 PHP 处理长标头并接收 $_FILE 数组中的数据吗? 或者,除了 $_FILE 数组之外,我还能以其他方式访问缺少的多部分部分吗?【问题讨论】:
不确定这是一个好还是坏的解决方案,但为什么不使用 tinyurl 之类的东西来缩短这些 url? 我同意最好减少该标头@yoda 中的 url 长度,但不幸的是我无法控制 Picasa 生成的 POST 请求.. 【参考方案1】:如果你真的需要访问原始传入的 HTTP 正文,那么如果你安装了 PECL 模块,你可以使用http_get_request_body(),如果没有,那么我相信有一个流包装器:
$httpBody = @file_get_contents('php://input');
虽然远非理想,但我不知道 $_FILES
有这个问题,需要注意。
【讨论】:
【参考方案2】:你完蛋了。
但无论如何,您都可以使用几种变通方法来实现它。您需要自己解析收到的表单数据。另一个问题是 PHP 不会让你看到原始的 mutlipart/form-data,所以你需要:
rewrite the multipart/form-data content type via .htaccess rules set always_populate_post_data=On in php.ini 读自file_get_contents("php://stdin")
分解 /form-data,这并不难,PEAR Mail_mimeDecode 可能会有所帮助
另一种方法是修补 PHP 解释器。 :/
【讨论】:
以上是关于如何处理 PHP 请求中的长标头声明?的主要内容,如果未能解决你的问题,请参考以下文章
net/http:请求已取消(等待标头时超出 Client.Timeout)为啥/如何处理?
Cors - 如何处理需要自定义标头的预检选项请求? (AWS:使用 vpc 端点的私有 API 网关)
使用 Express js 作为服务器的客户端(请求标头)如何处理 max-age、min-fresh 和 max-stale HTTP 标头?