it-roy-ru.com

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

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

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

78
GiladG

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

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

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

145
Ciaran McNulty

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

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

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

10

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

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

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

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

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

7
Georg Schölly

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

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

4
Oli

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

только измените 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
العاب فلاش

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

2
PatrikAkerstrand

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

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

1
Radon8472

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

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

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

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

copy($Origin, $dest);
0
Marcio Mazzucato

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

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

0
Peter Stuifzand

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

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

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

0
brianegge