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

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

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


person GiladG    schedule 26.05.2009    source источник
comment
Разве на серверах нет для этого прокси-модулей?   -  person jiggunjer    schedule 24.10.2017


Ответы (11)


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

copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');

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

person Ciaran McNulty    schedule 26.05.2009
comment
Помните, что allow_url_fopen должен быть включен в php.ini. - person mauro.dec; 20.08.2009
comment
Комментарий allow_url_fopen решен после часа ломки головы. Спасибо, @ mauro.dec! - person Michael Stalker; 30.06.2012
comment
что делают с такими URL http://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop ??? - person Yuseferi; 14.07.2012
comment
Спасибо за этот ответ - я думаю, что я почти готов! Когда вы говорите "/tmp/file.jpg" - что это относительно? КОРЕНЬ веб-сервера ... (например: / var / www / vhosts и т. Д.) Или корень веб-сайта: / httpdocs / ... ?? Не могу видеть появляющиеся файлы, а для параметра url-fopen установлено значение ON. !! - person itsricky; 17.01.2013
comment
@itsricky /tmp/my.file - ведущая косая черта всегда относится к корню файловой системы (сервер в вашем случае) независимо от используемой вами среды. - person Paul T. Rawkeen; 30.07.2013
comment
Не используйте https, просто http - person Edwin Thomas; 28.01.2015
comment
Я думаю, что при этом важно помнить о безопасности - вам нужно быть осторожными с тем, какие файлы вы загружаете на свой сервер, и если они находятся на пути, где такие вещи, как исполняемые файлы или PHP, могут быть запущены. - person Scott Flack; 25.05.2015

использовать

$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);
person dazzafact    schedule 17.01.2013
comment
Спасибо чувак!! второе решение работает .. главное решение не работает для меня: p - person Rajnish; 26.07.2013
comment
Хороший совет для небольших файлов, но для больших файлов память php взорвется :( - person Radon8472; 25.05.2014

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

<?php
//Get the file
$content = file_get_contents("http://example.com/image.jpg");

//Store in the filesystem. $fp = fopen("/location/to/save/image.jpg", "w"); fwrite($fp, $content); fclose($fp); ?>

Если вы хотите сохранить файл в базе данных, просто используйте переменную $ content и не сохраняйте файл на диск.

person Community    schedule 26.05.2009
comment
использование curl - хороший метод, потому что некоторые серверы не поддерживают file_get_contents по соображениям безопасности - person Rinto George; 20.02.2012
comment
Хороший совет для небольших файлов, но для больших файлов память php взорвется :( curl также не лучший выбор, потому что он не является частью стандартного php - person Radon8472; 25.05.2014

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

  • Удаленные файлы. Для этого необходимо allow_url_fopen включить в php.ini, но это самый простой способ.

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

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

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

person Georg Schölly    schedule 26.05.2009
comment
Почему даже не пытайтесь использовать сокеты напрямую? (Это то, что я использую, gist.github.com/0893a7ec908ff508aac6) - person Gajus; 16.11.2012
comment
@Gajus: вы не используете сокеты непосредственно в этом фрагменте. Вы используете возможность php для открытия удаленных файлов. - person Georg Schölly; 16.11.2012

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

$url = "http://other-site/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://other-site/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, чтобы убедиться, что это действительно изображение.

person Oli    schedule 26.05.2009
comment
Чтобы проверить изображение с помощью GD, попробуйте запустить это сразу после сохранения файла: psoug.org/snippet /Check_if_an_image_exists_GD_364.htm - если возвращается false, немедленно удалить файл. - person Oli; 26.05.2009
comment
Вы пропустили curl_exec($ch) перед curl_close($ch), и fclose($ch) следует поместить в конец, а не перед curl_close($ch), что означает закрытие файла до того, как в него ничего не будет записано, поэтому вы получите только пустой файл. - person O.O; 06.12.2010

Это очень просто, используя file_get_contents. Просто укажите URL-адрес в качестве первого параметра.

person PatrikAkerstrand    schedule 26.05.2009
comment
Это заблокировано для локальных файловых систем на множестве общих хостов по соображениям безопасности. cURL лучше, быстрее, сильнее и т. д. И обычно доступен на тех хостах, которые блокируют fopen в удаленных файловых системах. - person Oli; 26.05.2009
comment
если доступен cURL, это будет еще лучше. см. ‹a href=se2.php.net/curl› cUrl на php.net ‹/ а › - person PatrikAkerstrand; 26.05.2009

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

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

измените 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);
?>

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

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

Благодарность

person العاب فلاش    schedule 02.01.2012

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

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

person Peter Stuifzand    schedule 26.05.2009

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

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

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

person brianegge    schedule 26.05.2009

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

$origin = 'http://example.com/image.jpg';

$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);

$dest = 'myfolder/' . $filename . '.' . $ext;

copy($origin, $dest);
person Marcio Mazzucato    schedule 10.06.2017

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

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