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

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

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

Ответ 1

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

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

Это обеспечит необходимую конвейерную обработку и т.д. Если вам нужно предоставить некоторые параметры HTTP, есть третий параметр "контекст потока", который вы можете предоставить.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

Вот наиболее простой способ:

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

Ответ 6

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

Ответ 7

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

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

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

спасибо

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

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

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

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

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

copy($origin, $dest);

Ответ 12

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

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