使用 PHP 和 Curl 发布,深度数组
Posted
技术标签:
【中文标题】使用 PHP 和 Curl 发布,深度数组【英文标题】:Posting with PHP and Curl, deep array 【发布时间】:2011-04-07 01:14:53 【问题描述】:我正在尝试通过 curl 发帖,我一直在一遍又一遍地使用相同的代码,但现在我需要能够使用数组来发帖(我不确定是否有合适的术语?)。
我应该澄清一下,它专门是我要发布的一个文件,但我也无法让它与字符串一起使用,所以我认为它与此无关。
这很好:
$uploadData = 数组(); $uploadData['uploads'] = "@".$file; $uploadData['iagree'] = 'on';这似乎不起作用:
$uploadData = 数组(); $uploadData['uploads'][0] = "@".$file; $uploadData['iagree'] = 'on';在第二个示例中,我尝试使用属性 name="uploads[]" 复制输入
显然我正在尝试卷曲一个外部网站,但如果我尝试在自己的服务器上卷曲一个页面以便我可以看到正在发送的内容,我可以看到上传数组正在转换为字符串:
print_r($_POST); print_r($_FILES);返回:
大批 ( [上传] => 数组 [同意] => 开启 ) 大批 ( )这是我的完整卷发:
$uploadData = 数组(); $uploadData['uploads'][] = "@".$file; $uploadData['iagree'] = 'on'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $theLink); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $uploadData); $upload_response = curl_exec($ch); curl_close($ch);我已尝试提供尽可能多的信息,但如果我遗漏了什么,请随时询问,我会提供更多信息。
除此之外,有没有人有任何建议或解决方案?
【问题讨论】:
【参考方案1】:$uploadData['uploads[]'] = "@".$file;
并将其作为数组传递应该可以,但请记住,您需要文件的绝对路径。
“简单”HTTP(multipart/form-data 或 application/x-www-form-urlencoded)中没有发送“数组”的机制。但是,php 将键值对中的 [
和 ]
字符解释为特殊字符。 PHP 在那个 AFAIK 中是单独的,它不是 HTTP 机制,它只是 PHP 的输入解析,就像用 _
替换值名称中的 .
's。 Curl 是一个独立于 PHP 的 3rd 方包,因此不理解多维数组。
【讨论】:
谢谢你完美的工作,很抱歉回复晚了。我第一次发布这个问题时是半夜:D【参考方案2】:尝试传递查询字符串:
$uploadData = 'uploads[]=@' . $file . '&iagree=on&uploads[]=@' . $file2;
看看这是否适合你。
编辑
通读手册,字符串需要进行urlencoded,试试这个:
$uploadData = urlencode('uploads[]=@' . $file . '&iagree=on&uploads[]=@' . $file2);
从curl_setopt() 手册页收到此信息:
注意:
将数组传递给 CURLOPT_POSTFIELDS 会将数据编码为 multipart/form-data,而传递 URL 编码的字符串会将数据编码为 application/x-www-form-urlencoded。
我可能使用了不正确的 urlencode,试试这个:
$uploadData = 'uploads[]=' . urlencode('@' . $file) . '&iagree=' . urlencode('on') . '&uploads[]=' . urlencode('@' . $file2);
更新
好的,这是我最后一次尝试了。阅读 curl 页面上的一些用户 cmets,我发现了一些关于序列化子数组的内容。所以:
$uploadData = array('iagree' => 'on', 'uploads' => serialize(array('@' . $file)));
希望这是关键。如果这不起作用......那么它可能无法做到。
试一试,看看它是否有效。 (抱歉试错了,我没有办法测试!)
【讨论】:
发送字符串“@root/to/my/testfile.zip”而不是实际文件。但它确实将 $_POST 作为数组发送。 根据php.net/curl_setopt 的手册页更新了信息,因为字符串需要进行 urlencoded 以使用正确的编码传递。 url 编码更糟糕,绝对没有发布任何内容。我已经多次使用 curl 没有使用 urlencoding,所以我不确定是否有必要。尽管如此,在这种情况下它并没有帮助,尽管欢呼! 好的,又更新了,也许能用,不确定。对试验和错误感到抱歉。 这与我的第一条评论具有相同的响应。帖子现在根据需要作为数组发送,但不是文件,它只是字符串“@root/to/my/testfile.zip”以上是关于使用 PHP 和 Curl 发布,深度数组的主要内容,如果未能解决你的问题,请参考以下文章