Скопіюйте зображення з віддаленого сервера через HTTP


83

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

Приклад використання: Користувач бажає додати зображення до свого профілю. Зображення вже існує в Інтернеті, і користувач надає пряму URL-адресу. Я не хочу гаряче посилання на зображення, а імпортувати та обслуговувати з мого домену.


У серверів немає для цього проксі-модулів?
jiggunjer

Відповіді:


155

Якщо на вашому сервері увімкнено PHP5 і обгортку потоку HTTP, скопіювати його в локальний файл неймовірно просто:

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

Це подбає про будь-які трубопроводи тощо, що потрібно. Якщо вам потрібно надати деякі параметри HTTP, існує третій параметр "контекст потоку", який ви можете надати.


33
Пам'ятайте, allow_url_fopen має бути = on у php.ini.
mauro.dec

3
Коментар allow_url_fopen щойно вирішився за годину подряпин. Дякую, @ mauro.dec!
Michael Stalker

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

Дякую за цю відповідь - я думаю, що я майже там! Коли ви говорите "/tmp/file.jpg" - що це відносно? ROOT веб-сервера ... (наприклад: / var / www / vhosts тощо) або корінь веб-сайту: / httpdocs / ... ?? Не можу побачити файли, що з’являються, а для url-fopen встановлено значення ON. !!
itricky

1
Не використовуйте https, просто http
edCoder

31

використання

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

спасибі людино !! друге рішення працює .. верх усього рішення для мене не працює: p
Раджніш

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: Ви не використовуєте сокети безпосередньо в цьому фрагменті. Ви використовуєте можливість 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), це означає, що закрийте файл до того, як у файл нічого не буде записано, тому ви отримаєте лише порожній файл.
Hendra Uzia

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

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);
?>

нарешті, у своєму браузері введіть за цією URL-адресою http://www.example.com/download/m.php

Ви побачите в папці завантаження файл, завантажений з іншого сервера

Дякую


0

Використовуйте запит GET, щоб завантажити зображення та зберегти його у веб-доступному каталозі на вашому сервері.

Оскільки ви використовуєте PHP, ви можете використовувати curlдля завантаження файлів з іншого сервера.


0

Оскільки ви позначили своє запитання тегом "php", я припускаю, що ваш php працює на вашому сервері. Найкраще, якщо ви керуєте власним веб-сервером, а потім скомпілюєте cURL у php. Це дозволить вашому веб-серверу робити запити на інші веб-сервери. З точки зору безпеки це може бути досить небезпечно, тому для більшості основних провайдерів веб-хостингу ця опція не буде ввімкнена.

Ось сторінка керівництва php щодо використання cURL . У коментарях ви можете знайти приклад завантажень та файли зображень.

Якщо ви не хочете використовувати libcurl, ви можете щось кодувати за допомогою fsockopen. Це вбудовано у php (але може бути вимкнено на вашому хості), і воно може безпосередньо читати та записувати в сокети. Див. Приклади на сторінці fsockopen man .


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.