Копирование изображения с удаленного сервера по протоколу HTTP
Я ищу простой способ импорта / копирования изображений с удаленного сервера в локальную папку с помощью PHP. У меня нет FTP-доступа к серверу, но все удаленные изображения могут быть доступны через HTTP (т. е. http://www.mydomain.com/myimage.jpg).
пример использования: пользователь хочет добавить изображение в свой профиль. Изображение уже существует в интернете, и пользователь предоставляет прямой URL-адрес. Я не хочу, чтобы hotlink изображение, но импортировать и обслуживать из моего домена.
12 ответов:
Если у вас есть PHP5 и HTTP stream wrapper включен на вашем сервере, это невероятно просто скопировать его в локальный файл:
copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');Это будет заботиться о любых конвейеризация и т. д. это необходимо. Если вам нужно предоставить некоторые параметры HTTP, вы можете предоставить третий параметр "контекст потока".
использовать
$imageString = file_get_contents("http://example.com/image.jpg"); $save = file_put_contents('Image/saveto/image.jpg',$imageString);
PHP имеет встроенную функцию file_get_contents (), которая считывает содержимое файла в строку.
//хранить в файловой системе. $fp = fopen ("/location/to/save/image.jpg", " w"); fwrite($fp, $content); fclose($fp); ?> Если вы хотите сохранить файл в базе данных, просто используйте переменную $content и не сохраняйте файл на диск.
У вас есть примерно эти четыре возможности:
удаленные файлы. Это нужно
allow_url_fopenдля включения в php.ini, но это самый простой способ.в качестве альтернативы вы можете использовать cURL если ваша установка PHP поддерживает его. Есть даже пример.
и если вы действительно хотите сделать это вручную, используйте HTTP модуль.
даже не пытайся использовать сокеты напрямую.
вот самый простой способ:
$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, чтобы убедиться, что это действительно изображение.
Это очень просто с помощью функции file_get_contents. Просто укажите URL в качестве первого параметра.
создать папку и назвать ее например скачать откройте блокнот и вставьте этот код
только изменить 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
вы увидите в папке загрузки файл загрузки из других сервер
спасибо
Я попытался скопировать / загрузить удаленные файлы, используя функцию копирования за прокси, но копия подключается напрямую без прокси.
Я попытался установить Мои настройки в качестве контекста по умолчанию и дал его как 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 Пакет обновления 3
- Apache 2.2.12 (работает как Служба)
- PHP 5.3.0 (API20090626, TS, VC6) (настроен как модуль apache)
urlfopen включена потоки http и https зарегистрированы для php
используйте запрос GET, чтобы загрузить изображение и сохранить его в веб-доступном каталоге на вашем сервере.
Как вы используете PHP, вы можете использовать
curlдля загрузки файлов с другого сервера.
поскольку вы отметили свой вопрос "php", я предполагаю, что вы используете php на своем сервере. Лучше всего, если вы управляете своим собственным веб-сервером, а затем компилируете cURL в php. Это позволит вашему веб-серверу выполнять запросы к другим веб-серверам. Это может быть довольно опасно с точки зрения безопасности, поэтому большинство основных поставщиков веб-хостинга не включена эта опция.
здесь страница PHP на человека с помощью curl. В комментариях вы можете найти пример, который загрузка и файл изображения.
Если вы не хотите использовать libcurl, вы можете закодировать что-то с помощью fsockopen. Это встроено в php (но может быть отключено на вашем Хосте) и может напрямую читать и записывать в сокеты. Смотрите примеры на странице fsockopen man.
для тех, кому нужно сохранить исходное имя файла и расширение
$origin = 'http://example.com/image.jpg'; $filename = pathinfo($origin, PATHINFO_FILENAME); $ext = pathinfo($origin, PATHINFO_EXTENSION); $dest = 'myfolder/' . $filename . '.' . $ext; copy($origin, $dest);
ответ помог мне скачать изображение с сервера на клиентскую сторону.
<a download="original_file.jpg" href="file/path.jpg"> <img src="file/path.jpg" class="img-responsive" width="600" /> </a>
Comments