使用PHP和Curl发布深层数组

时间:2010-09-01 22:01:29

标签: php arrays post curl

我正试图通过curl发布,我一直在使用相同的代码没有问题,但现在我需要能够使用数组的帖子(我不确定是否有一个正确的这个术语?)。

我应该澄清一下,这是一个我试图发布的文件,但我无法使用字符串,所以我不认为它也是如此。

这绝对没问题:

$uploadData = array();
$uploadData['uploads'] = "@".$file;
$uploadData['iagree'] = 'on';

这似乎不起作用:

$uploadData = array();
$uploadData['uploads'][0] = "@".$file;
$uploadData['iagree'] = 'on';

在第二个示例中,我尝试使用属性name =“uploads []”

复制输入

显然我正在尝试卷曲一个外部网站,但如果我在我自己的服务器上实验卷曲页面以便我可以看到正在发送的内容,我可以看到上传数组正在转换为字符串:

print_r($_POST);
print_r($_FILES);

返回:

Array
(
    [uploads] => Array
    [iagree] => on
)

Array
(
)

这是我的完整卷曲:

    $uploadData = array();
    $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);

我试图提供尽可能多的信息,但如果我错过了什么,请随意提问,我会提供更多信息。

除此之外,有没有人有任何建议或解决方案?

2 个答案:

答案 0 :(得分:2)

$uploadData['uploads[]'] = "@".$file;并将其作为数组传递应该有效,请记住,您需要文件的绝对路径。

“简单”HTTP(multipart / form-data或application / x-www-form-urlencoded)中没有机制来发送'数组'。但是,PHP会解释[&键值对中的]个字符为特殊字符。 PHP在AFAIK中是单独的,它不是HTTP机制,它只是PHP输入的解析,就像用.替换值的名称中的_一样。 Curl是第三方软件包,与PHP分开存在,因此不了解多维数组。

答案 1 :(得分:0)

尝试传递查询字符串:

 $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页面阅读一些用户注释,我发现了一些关于序列化子数组的信息。所以:

$uploadData = array('iagree' => 'on', 'uploads' => serialize(array('@' . $file)));

希望这是关键。如果这不起作用......那么可能无法做到。

给它一个镜头,看它是否有效。 (抱歉试用和错误,我没有测试方法!)