Отправка с PHP и Curl, глубокий массив - PullRequest
1 голос
/ 02 сентября 2010

Я пытаюсь опубликовать через 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 голосов
/ 02 сентября 2010

$uploadData['uploads[]'] = "@".$file; и передача его в виде массива должна работать, просто имейте в виду, что вам нужен абсолютный путь к файлу.

В «простом» HTTP нет механизма (multipart / form-data илиapplication / x-www-form-urlencoded) для отправки «массивов».Однако PHP интерпретирует символы [ & ] в парах ключ-значение как специальные.PHP один в этом AFAIK, это не механизм HTTP, а только синтаксический анализ входных данных PHP, как и замена . в именах значений на _.Curl - это сторонний пакет, который живет отдельно от PHP и поэтому не понимает многомерных массивов.

0 голосов
/ 02 сентября 2010

Попробуйте передать строку запроса:

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

Посмотрите, работает ли это для вас.

EDIT

Читая руководство, строка должна быть закодирована, попробуйте это:

$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)));

Надеюсь, это ключ. Если это не сработает ... ну, это может быть невозможно.

Сделайте это и посмотрите, работает ли это. (Извините за проб и ошибок, у меня нет способа проверить это!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...