Как загрузить файл на удаленный сервер с помощью cURL?

Я искал в Интернете, а также много сообщений от SO, и мне не повезло. У меня есть следующий код для получения файла с удаленного сервера.

$url  = 'http://www.example.com/images/abc.png';
$path = '/home/axxxxxxx/public_html/images/abc.png';

$fp = fopen($path, 'w');

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);

$data = curl_exec($ch);

curl_close($ch);
fclose($fp);

$url и $path представляют файл с одного сервера. Когда я запускаю код, html-страница выводит странный код, который начинается с ‰PNG IHDRàw=ø IDATxÚ•yLWÇ¿3³3³ì² (VP)àUÓzDc«....

Когда я открыл файл new.png с помощью текстового редактора, код, который я получил, был идентичен коду на странице, на которой находится вышеприведенный скрипт php cURL. (Кажется, скрипт читает правильный файл)

Я также получаю сообщения об ошибках, говорящие,

  • Warning: fopen(../axxxxxxx/public_html/images/new.png) [function.fopen]: failed to open stream: No such file or directory in /home/ayyyyyyy/public_html/test.php on line 5
  • Warning: curl_setopt(): supplied argument is not a valid File-Handle resource in /home/ayyyyyyy/public_html/test.php on line 8

Отображаемый здесь набор символов Юникода (PNG IHDRàw=ø IDATxÚ•yLWÇ¿3³3³ì² (VP)àUÓzDc«)

  • Warning: fclose(): supplied argument is not a valid stream resource in /home/ayyyyyyy/public_html/test.php on line 12

Оба сайта размещены на 000webhost.com, если это имеет значение.

Как загрузить файл на компьютер пользователя?


person Sid    schedule 18.03.2013    source источник
comment
Сообщения об ошибках достаточно ясны: вы не смогли правильно открыть дескриптор файла. Вы пытаетесь использовать этот недопустимый дескриптор файла с curl/fclose, выдавая больше предупреждений. Никогда не рассчитывайте на успех при работе с внешними ресурсами — всегда проверяйте наличие ошибок. например fopen() возвращает логическое значение FALSE в случае ошибки.   -  person Marc B    schedule 18.03.2013


Ответы (1)


Проблема (если есть) в том, что файл, который вы загружаете, является файлом PNG, и вы пытаетесь прочитать его как текстовый файл — это «странный код», который вы видите.

Если вы, прежде чем выводить файл в браузер, отправили заголовок Content-Type, вы увидите реальное изображение:

header('Content-Type: image/png');
echo $data;

Под download the file to the user's computer я предполагаю, что вы хотите предложить пользователю загрузить файл. Для этого установите заголовок Content-disposition как attachment. Вы также можете комбинировать это с заголовком типа содержимого сверху:

header("Content-Type: image/png");
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"some_image.png\""); 
person newfurniturey    schedule 18.03.2013
comment
Спасибо. Я попробую это. Я даю сценарий много запросов. (например, загрузить много типов файлов). Я безуспешно пробовал пример функции read_file php.net. А как быть с сообщениями об ошибках? - person Sid; 18.03.2013
comment
@Sid Ошибка означает, что либо файл не может быть создан или, и это наиболее вероятный кандидат, у вас нет разрешения на создание/запись в файл. Попробуйте изменить права доступа к папке /images/ на 0777 и посмотрите, работает ли это. - person newfurniturey; 18.03.2013
comment
@Sid Ты уверен, что путь правильный? Может попробовать $path = $_SERVER['DOCUMENT_ROOT'] . '/images/';? Или, если папка с изображениями относится к скрипту, который вы запускаете, вы можете попробовать относительный путь: $path = 'images/'; - person newfurniturey; 19.03.2013
comment
@newfurniturey, у меня была такая же проблема с fopen(), и использование $_SERVER['DOCUMENT ROOT'] решило ее. Большое спасибо за совет! - person Mahm00d; 10.05.2013