Копировать изображение с удаленного сервера по HTTP - PullRequest
78 голосов
/ 26 мая 2009

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

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

Ответы [ 12 ]

145 голосов
/ 26 мая 2009

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

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

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

28 голосов
/ 17 января 2013

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

$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);
10 голосов
/ 26 мая 2009

PHP имеет встроенную функцию file_get_contents (), которая считывает содержимое файла в строку. <?php //Get the file $content = file_get_contents("<a href="http://example.com/image.jpg" rel="noreferrer">http://example.com/image.jpg</a>");</p> <p>//Store in the filesystem. $fp = fopen("/location/to/save/image.jpg", "w"); fwrite($fp, $content); fclose($fp); ?> Если вы хотите сохранить файл в базе данных, просто используйте переменную $ content и не сохраняйте файл на диск.

7 голосов
/ 26 мая 2009

У вас есть четыре варианта:

4 голосов
/ 26 мая 2009

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

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

2 голосов
/ 02 января 2012

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

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

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

спасибо

2 голосов
/ 26 мая 2009

С помощью file_get_contents это очень просто. Просто укажите URL в качестве первого параметра.

1 голос
/ 25 мая 2014

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

Я попытался установить свои настройки в качестве контекста по умолчанию и присвоил ему 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

0 голосов
/ 11 июня 2017

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

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

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

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

copy($origin, $dest);
0 голосов
/ 18 сентября 2016

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

<a download="original_file.jpg" href="file/path.jpg">
  <img src="file/path.jpg" class="img-responsive" width="600" />
</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...