cURL командной строки с URL-адресом, заключенным в кавычки, PHP CURL не работает

Итак, у меня есть URL-адрес в кодировке Amazon S3, который я хочу загрузить. Если я передаю URL без кавычек, я получаю 403 Запрещенный ответ от S3.

curl -O https://zencoder-temp-storage-us-east-1.s3.amazonaws.com/t/20141008/413f96bd17a210c0cfe2997d83a4782c/Nerve_Flossing_Highly_Irratible_Radial_Nerve_Wartenburgs_Syndrome-thumb.jpg?AWSAccessKeyId=AKIAI456JQ76GBU7FECA&Signature=Sd18YXJIMvLqeRFZYCzDNYdpg7U%3D&Expires=1412866120

Но, просто заключив его в кавычки, прекрасно работает из командной строки:

curl -O "https://zencoder-temp-storage-us-east-1.s3.amazonaws.com/t/20141008/413f96bd17a210c0cfe2997d83a4782c/Nerve_Flossing_Highly_Irratible_Radial_Nerve_Wartenburgs_Syndrome-thumb.jpg?AWSAccessKeyId=AKIAI456JQ76GBU7FECA&Signature=Sd18YXJIMvLqeRFZYCzDNYdpg7U%3D&Expires=1412866120"

Но … когда я пытаюсь реализовать это в PHP, я заканчиваю тем, что сохраняю файл с 0 байтами.

$curl = curl_init("'".$url."'");
$fp = fopen($filepath, "w");
curl_setopt($curl, CURLOPT_FILE, $fp);
curl_exec ($curl);
curl_close ($curl);
fclose($fp);

Есть ли способ сделать это с помощью PHP, который мне не хватает?

РЕДАКТИРОВАТЬ: предоставить реальный S3 url для более простого тестирования.

0

Решение

PHP curl просто ожидает параметр. Когда вы добавляете кавычки в командной строке, вы утверждаете, что все, что находится между кавычками, является конкретным параметром, который вы пытаетесь передать в команду. Большинство команд командной строки работают таким образом. Например, если вы хотите переместить файл в командной строке, вы можете добавить путь в кавычках:

mv foo.txt "/home/bar/foo.txt"

Это отлично подходит для сложных параметров (таких как URL), файлов с пробелами в именах и т. Д.

Что касается PHP, функция curl просто ожидает параметр, и она будет выполнять надлежащее внутреннее экранирование. Поэтому, когда вы добавляете кавычки в команду curl PHP, вы фактически просите PHP загрузить этот URL:

'https://some.amazon.bucket.s3.amazonaws.com/o/123456/582305890298509238/my-video.mp4?AWSAccessKeyId=RANDOMKEYHERE&Signature=SIG&Expires=1412805904'

В отличие от:

https://some.amazon.bucket.s3.amazonaws.com/o/123456/582305890298509238/my-video.mp4?AWSAccessKeyId=RANDOMKEYHERE&Signature=SIG&Expires=1412805904

Вы упомянули, что использование без кавычек не работает в curl командной строки. Вы пытались добавить кавычки в PHP? Я предполагаю, что это будет работать.

Еще одна вещь, которую надо утомить, — это разрешения вашего S3 bucket. Возможно, файл, который вы пытаетесь загрузить с S3, не имеет правильных прав доступа, которые позволили бы PHP или вашему веб-серверу получить к нему доступ. Это вызовет ошибку 403.

0

Другие решения

Похоже, это не кавычки. Цитаты абсолютно не важны в этом случае.

Похоже, что-то не так с сертификатами SSL. Я вижу, у вас SSL сертификат не хорош. Даже очень плохо.

Вам необходимо отключить проверку:

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);

ОБНОВИТЬ

Этот код делает свое дело:

$curl = curl_init('https://some.amazon.bucket.s3.amazonaws.com/o/123456/582305890298509238/my-video.mp4?AWSAccessKeyId=RANDOMKEYHERE&Signature=SIG&Expires=1412805904');
$fp = fopen(getcwd() . '/1.txt', "w");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
fwrite($fp, curl_exec($curl));
fclose($fp);
curl_close($curl);

Я проверил это

Я все еще думаю, что ваша основная проблема — SSL сертификат …

Кстати, содержимое файла:

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidAccessKeyId</Code><Message>The AWS Access Key Id you provided does not exist in our records.</Message><RequestId>6DCACEEE9E886AF1</RequestId><HostId>JPHAbX6+Ql34/6Yvso0vofODswNtZvwPluJj3R6XBBsSkq0hjQ9cy/Aj6e73EOQt</HostId><AWSAccessKeyId>RANDOMKEYHERE</AWSAccessKeyId></Error>
0

Ваш URL содержит различные специальные символы и целую строку, помещенную в один символ, поэтому мы используем двойные кавычки.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector