2010-09-01 71 views
1

我试图通过curl发布,我一直使用相同的代码一遍又一遍没有问题,但现在我需要能够使用数组的帖子(我我不确定这是否有合适的名词?)。使用PHP和Curl,深数组发布

我应该澄清,它是一个特定的文件,我试图发布,但我无法得到它与一个字符串工作,所以我不认为这是太过这样做。

这是absouletly罚款:

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

不出现工作:

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

在第二个例子中,我试图复制与属性名称的输入=“上传[]“

很显然,我试图蜷缩一个外部网站,但如果我在自己的服务器上实验卷曲页面,以便我可以看到正在发送的内容,则可以看到上传的数组正在合并nverted字符串:

 
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

$uploadData['uploads[]'] = "@".$file;并传递它作为数组应该工作,只要记住你需要文件的绝对路径。

“简单”HTTP(multipart/form-data或application/x-www-form-urlencoded)没有机制发送数组。但是,PHP将键值对中的字符解释为特殊字符。 PHP是单独在那个AFAIK中,它不是一个HTTP机制,它只是对输入PHP的解析,就像用_替换.的值。 Curl是一个独立于PHP的第三方包,因此不理解多维数组。

+0

Thankyou完美地工作,对于迟到的回复感到抱歉。当我第一次发布这个问题时是半夜:D – Rob 2010-09-02 11:12:23

0

尝试通过查询字符串:

$uploadData = 'uploads[][email protected]' . $file . '&iagree=on&uploads[][email protected]' . $file2; 

看看是否能为你工作。

编辑

通过人工阅读,字符串需要进行url编码,试试这个:

$uploadData = urlencode('uploads[][email protected]' . $file . '&iagree=on&uploads[][email protected]' . $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); 

UPDATE

好吧,这是我在这最后一投。在curl页面阅读一些用户注释我发现了一些关于序列化子数组的内容。所以:

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

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

给一个镜头,看看它是否工作。 (对不起,试验和错误,我没有一个方法来测试它!)

+0

发送字符串“@ root/to/my/testfile.zip”而不是实际的文件。但它确实将$ _POST作为数组发送。 – Rob 2010-09-01 22:16:07

+0

根据http://www.php.net/curl_setopt手册页中的信息进行更新,因为字符串需要使用urlencoded才能通过正确的编码传递。 – 2010-09-01 22:22:56

+0

url编码更糟,绝对没有任何内容被发布。我已经多次使用curl而没有使用urlencoding,所以我不确定是否有必要。尽管如此,在这种情况下它并没有帮助,但欢呼! – Rob 2010-09-01 22:26:31