首页 文章

使用PHP和Curl发布深层数组

提问于
浏览
1

我试图通过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 回答

  • 2

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

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

  • 0

    尝试传递查询字符串:

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

    看看它是否适合你 .

    EDIT

    阅读手册,字符串需要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);
    

    UPDATE

    好的,这是我最后一次拍摄 . 通过curl页面阅读一些用户注释,我发现了一些关于序列化子数组的信息 . 所以:

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

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

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

相关问题