Копировать изображение с удаленного сервера по 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>