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


82

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

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


На серверах нет для этого прокси-модулей?
jiggunjer

Ответы:


154

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

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

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


33
Помните, что allow_url_fopen должен быть включен в php.ini.
mauro.dec

3
Комментарий allow_url_fopen решен в течение часа, когда мы ломали голову. Спасибо, @ mauro.dec!
Майкл Сталкер,

2
что делают с такими URL http://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop ???
Yuseferi

Спасибо за этот ответ - я думаю, я почти готов! Когда вы говорите "/tmp/file.jpg" - что это относительно? КОРЕНЬ веб-сервера ... (например: / var / www / vhosts и т. Д.) Или корень веб-сайта: / httpdocs / ... ?? Не могу видеть появляющиеся файлы, а для параметра url-fopen установлено значение ON. !!
itsricky

1
Не используйте https, просто http
edCoder

31

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

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

Спасибо чувак!! второе решение работает .. главное решение не работает для меня: p
Rajnish

4
Хороший совет для маленьких файлов, но для больших файлов php-память взорвется :(
Radon8472

10

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 и не сохраняйте файл на диск.


2
использование curl - хороший метод, потому что некоторые серверные ребята не поддерживают file_get_contents по соображениям безопасности
Ринто Джордж

1
Хороший совет для маленьких файлов, но для больших файлов php-память взорвется :( curl тоже не лучший выбор, потому что он не является частью стандартного php
Radon8472

8

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


Почему «Даже не пытайтесь использовать сокеты напрямую»? (Это то, что я использую, gist.github.com/0893a7ec908ff508aac6 )
Gajus

@Gajus: вы не используете сокеты непосредственно в этом фрагменте. Вы используете возможность php для открытия удаленных файлов.
Георг Шёлли

4

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

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


1
Для проверки изображения с помощью GD рассмотрите возможность запуска этого сразу после сохранения файла: psoug.org/snippet/Check_if_an_image_exists_GD_364.htm - если он вернется неверно, немедленно удалите файл.
Оли

4
Вы пропустили curl_exec($ch)раньше curl_close($ch)и fclose($ch)должны быть помещены в конец, а не раньше curl_close($ch), это означает, что закройте файл до того, как в него ничего не будет записано, поэтому вы получите только пустой файл.
Хендра Узия

2

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


1
Это заблокировано для локальных файловых систем на множестве общих хостов по соображениям безопасности. cURL лучше, быстрее, сильнее и т. д. И обычно доступен на тех хостах, которые блокируют fopen в удаленных файловых системах.
Оли

если cURL доступен, это было бы еще лучше. см. <a href=" se2.php.net/curl"> cUrl на php.net </a>
PatrikAkerstrand,

2

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

только измените 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

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

благодаря


0

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

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


0

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

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

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


0

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

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

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

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

copy($origin, $dest);

-5

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

<a download="original_file.jpg" href="file/path.jpg">
  <img src="file/path.jpg" class="img-responsive" width="600" />
</a>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.