У меня проблема с загрузкой файлов с cURL на удаленный сервер. Удаленный сервер принимает этот файл только в том случае, если переменные POST приходят в порядок. В моем случае: sid, cmd, uploadfile Я протестировал его с помощью простой формы загрузки HTML в этом порядке, все в порядке. Но если я заменю порядок полей ввода, например: cmd, sid, uploadfile, он отклонит мою загрузку.
Итак, вот мой код cURL, он не отправляет переменные в том порядке, который я задал в массиве. Как заставить cURL использовать POST в том же порядке, что и переменные.
$file = "/var/www/html/dl/big.mp4"; $target_url = 'http://upload.site/uploadpage'; $file_name_with_full_path = realpath($file); $post = array('sid' => 'H1nbWKcdYP7eS7DzJk0Z6BjGaC842vPO', 'cmd' => 'uploadVideoFiles', 'uploadfile'=>'@'.$file_name_with_full_path); $ch = curl_init(); $browser = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'; curl_setopt($ch, CURLOPT_USERAGENT, $browser); curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); curl_setopt($ch, CURLOPT_URL, $target_url); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_RETURNTRANSFER,0); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Encoding: gzip, deflate', 'Accept-Language: en-US,en;q=0.5', 'Cache-Control: max-age=0', 'Connection: keep-alive', 'Host: upload.sitehost', ) ); $result=curl_exec($ch); curl_close ($ch); echo $result;
Документация PHP говорит об CURLOPT_POSTFIELDS
: CURLOPT_POSTFIELDS
:
Этот параметр может быть передан как строка с urlencoded, например 'para1 = val1 & para2 = val2 & …', или как массив с именем поля в качестве ключа и данными поля в качестве значения.
Поэтому попробуйте вместо этого использовать http_build_query()
:
<?php $post = array('sid' => 'H1nbWKcdYP7eS7DzJk0Z6BjGaC842vPO', 'cmd' => 'uploadVideoFiles', 'uploadfile'=>'@'.$file_name_with_full_path); $post = http_build_query($post); ...
Но установка CURLOPT_SAFE_UPLOAD
– отличная идея. Вместо этого вы должны использовать curl_file_create()
, поэтому ваш окончательный код может выглядеть так:
<?php $file = "/var/www/html/dl/big.mp4"; $target_url = 'http://upload.site/uploadpage'; $file_name_with_full_path = realpath($file); $post = [ 'sid' => 'H1nbWKcdYP7eS7DzJk0Z6BjGaC842vPO', 'cmd' => 'uploadVideoFiles', 'uploadfile'=>curl_file_create($file_name_with_full_path) ]; $post = http_build_query($post); $ch = curl_init($target_url); curl_setopt_array($ch, [ CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', CURLOPT_POSTFIELDS => $post, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, ]); $result = curl_exec($ch); curl_close($ch); echo $result;
Я решил проблему, это была моя ошибка, cmd не был
'cmd' => 'uploadVideoFiles'
это было:
'cmd' => 'uploadVideoFile'