Копировать изображение с удаленного сервера по HTTP

Я ищу простой способ импорта / копирования изображений с удаленного сервера в локальную папку с помощью PHP. У меня нет FTP-доступа к серверу, но все удаленные изображения можно получить через HTTP (например, http://www.mydomain.com/myimage.jpg ).

Пример использования: пользователь хочет добавить изображение в свой профиль. Изображение уже существует в Интернете, и пользователь предоставляет прямой URL-адрес. Я не хочу ссылаться на изображение, но импортировать и обслуживать из своего домена.

Если на вашем сервере включена оболочка PHP5 и HTTP-потоковая оболочка, ее просто невозможно скопировать в локальный файл:

copy('http://img.ruphp.com/php/f', '/tmp/file.jpeg'); 

Это позаботится о любой конвейерной обработке и т. Д., Что необходимо. Если вам нужно предоставить некоторые параметры HTTP, есть третий параметр «контекст потока», который вы можете предоставить.

использование

 $imageString = file_get_contents("http://example.com/image.jpg"); $save = file_put_contents('Image/saveto/image.jpg',$imageString); 

PHP имеет встроенную функцию file_get_contents (), которая считывает содержимое файла в строку.

 <? PHP
 // Получить файл
 $ content = file_get_contents (" http://example.com/image.jpg "); 

// Хранить в файловой системе.
$ fp = fopen ("/ location / to / save / image.jpg", "w");
fwrite ($ fp, $ content);
fclose ($ FP);
?>
Если вы хотите сохранить файл в базе данных, просто используйте переменную $ content и не сохраняйте файл на диске.

У вас есть эти четыре возможности:

  • Удаленные файлы . Для этого нужно allow_url_fopen в php.ini, но это самый простой способ.

  • В качестве альтернативы вы можете использовать cURL, если ваша установка PHP поддерживает его. Есть даже пример .

  • И если вы действительно хотите сделать это вручную, используйте HTTP-модуль .

  • Даже не пытайтесь напрямую использовать сокеты .

Вот самый простой способ:

 $url = "http://img.ruphp.com/php/image.png"; $dir = "/my/local/dir/"; $rfile = fopen($url, "r"); $lfile = fopen($dir . basename($url), "w"); while(!feof($url)) fwrite($lfile, fread($rfile, 1), 1); fclose($rfile); fclose($lfile); 

Но если вы делаете много и много этого (или ваш хост блокирует доступ к файлам для удаленных систем), подумайте об использовании CURL, который более эффективен, мягко быстрее и доступен на более общих хостах.

Вы также можете обмануть пользовательский агент как настольный, а не бот!

 $url = "http://img.ruphp.com/php/image.png"; $dir = "/my/local/dir/"; $lfile = fopen($dir . basename($url), "w"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'); curl_setopt($ch, CURLOPT_FILE, $lfile); fclose($lfile); curl_close($ch); 

В обоих случаях вы можете пройти через GD, чтобы убедиться, что это действительно изображение.

Это чрезвычайно просто, используя file_get_contents . Просто укажите url как первый параметр.

создайте папку и назовите ее, например, загрузите открытую блокнот и вставьте этот код

только измените http://www.google.com/aa.zip файл и сохраните его в m.php, например

chamod php-файл до 666, а загрузка папки – 777

 <?php define('BUFSIZ', 4095); $url = 'http://www.google.com/aa.zip'; $rfile = fopen($url, 'r'); $lfile = fopen(basename($url), 'w'); while(!feof($rfile)) fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ); fclose($rfile); fclose($lfile); ?> в <?php define('BUFSIZ', 4095); $url = 'http://www.google.com/aa.zip'; $rfile = fopen($url, 'r'); $lfile = fopen(basename($url), 'w'); while(!feof($rfile)) fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ); fclose($rfile); fclose($lfile); ?> 

наконец, из вашего браузера введите этот URL http://www.example.com/download/m.php

вы увидите в папке загрузки загрузку файла с другого сервера

благодаря

Используйте GET-запрос для загрузки изображения и сохранения его в веб-каталог, доступный на вашем сервере.

Когда вы используете PHP, вы можете использовать curl для загрузки файлов с другого сервера.

Поскольку вы отметили свой вопрос «php», я буду считать ваш php на вашем сервере. Лучше всего, если вы контролируете свой собственный веб-сервер, а затем скомпилируете cURL в php. Это позволит веб-серверу отправлять запросы другим веб-серверам. Это может быть весьма опасно с точки зрения безопасности, поэтому большинство базовых хостинг-провайдеров не будут иметь эту возможность.

Вот страница man php при использовании cURL . В комментариях вы можете найти пример загрузки и файла изображения.

Если вы не хотите использовать libcurl, вы можете создать код с помощью fsockopen. Это встроено в php (но может быть отключено на вашем хосте) и может напрямую читать и записывать в сокеты. См. Примеры на странице man fsockopen .

Я пытался копировать / загружать удаленные файлы, используя функцию копирования behint proxy, но копия напрямую соединяется без прокси.

Я попытался установить мои настройки в качестве контекста по умолчанию и дал ему как 3. параметр функции для копирования.

Но похоже, что контекст никогда не используется, но readfile или get_headers используют один и тот же контекст.

Вот мой код:

 $url = "http://myserver.com/testfile"; $context_opts = array( "http" => array( "proxy" => "tcp://myProxy:8080", "request_fulluri" => True, "ignore_errors" => true ) ); stream_context_get_default($context_opts); print_r(get_headers($url,1)); copy($url,$filename, stream_context_create($context_opts)); 

Мой сервер работает с:

  • Windows XP SP3
  • Apache 2.2.12 (работает как служба)
  • PHP 5.3.0 (API20090626, TS, VC6) (настроен как модуль apache)

urlfopen включен HTTP и https потоки зарегистрированы для php

Для тех, кому необходимо сохранить исходное имя файла и расширение

 $origin = 'http://example.com/image.jpg'; $filename = pathinfo($origin, PATHINFO_FILENAME); $ext = pathinfo($origin, PATHINFO_EXTENSION); $dest = 'myfolder/' . $filename . '.' . $ext; copy($origin, $dest); 

Этот ответ помог мне загрузить изображение с сервера на клиентскую сторону.

 <a download="original_file.jpg" href="file/path.jpg"> <img src="file/path.jpg" class="img-responsive" width="600" /> </a>