Как я могу перевести эту команду 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);
Попробуй это:
$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);
Правильнее было бы прочитать файл в строке, а затем предоставить эту строку параметрам CURLOPT_POSTFIELDS. Эта функция чтения в строку не предоставляется libcurl, но выполняется клиентом командной строки, и я не думаю, что привязка PHP / CURL предлагает эквивалент.
В командной строке используется –data-binary, которая соответствует CURLOPT_POSTSFIELDS со строкой, а не массивом хэшей, так как массив переводит сообщение в многостраничный пост (который в командной строке работает с -F, –form). Кроме того, пользовательский запрос, установленный для POST, абсолютно лишний.
Обычно запуск командной строки с помощью «–libcurl test.c» – это хороший способ получить первую черновик версии программы C с использованием API C, но поскольку PHP API очень похож, он должен работать как достойный старт в большинстве случаев.
Изменить: и пользовательское изменение / предоставление заголовка «Content-Length:» никогда не является хорошей идеей, если вы не прекрасно знаете, что делаете. libcurl всегда будет предоставлять тот, который создается на основе данных, которые вы передаете ему.
$data = array('file'=> '@' . $filename);
Вам нужно добавить имя файла с помощью «@», чтобы сообщить CURL, что это фактически имя файла, а не просто строка. Заголовки также не требуются, поскольку CURL заполняет их сами.