CLI CURL -> PHP CURL - PullRequest
       7

CLI CURL -> PHP CURL

3 голосов
/ 19 июля 2011

Как мне перевести эту команду curl, чтобы она работала в скрипте PHP?

curl --request POST --data-binary '@import.xml' --header "Content-Type: application/atom+xml" --header "Content-Length: 378" "http://url.com"

это не работает:

$data = array('file'=>$filename);                    

    $headers = array(
        'Content-Type: application/atom+xml',
        'Content-Length: 378'
    );

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'httpL//url.com');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
curl_exec($ch);

Ответы [ 3 ]

4 голосов
/ 10 сентября 2011

Попробуйте это:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/atom+xml'
    ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://siteurl.com');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($filename));  
curl_exec($ch);
0 голосов
/ 20 июля 2011

Правильнее было бы прочитать файл в строку и затем предоставить эту строку для параметров CURLOPT_POSTFIELDS. Эта функция чтения в строку не предоставляется libcurl, но выполняется клиентом командной строки, и я не думаю, что привязка PHP / CURL предлагает эквивалент.

В командной строке используется --data-binary, которая соответствует CURLOPT_POSTSFIELDS со строкой, а не хеш-массиву, поскольку массив превратит сообщение в составное сообщение (что командная строка делает с -F, --form ). Кроме того, пользовательский запрос, установленный на POST, является излишним.

Обычно запуск командной строки с "--libcurl test.c" - это хороший способ получить первый черновой вариант программы на C, использующий C API, но, поскольку PHP API очень похож, он должен работать достойно начать в большинстве случаев.

Редактировать: и пользовательское изменение / предоставление заголовка «Content-Length:» никогда не будет хорошей идеей, если вы не очень хорошо знаете, что делаете. libcurl всегда будет предоставлять тот, который генерируется на основе данных, которые вы ему передаете.

0 голосов
/ 19 июля 2011
$data = array('file'=> '@' . $filename);                    

Вам необходимо добавить к имени файла символ «@», чтобы сказать CURL, что на самом деле это имя файла, а не просто строка. Заголовки также не требуются, так как CURL заполняет их сам по себе.

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