Я ищу простой способ импорта / копирования изображений с удаленного сервера в локальную папку с помощью PHP. У меня нет FTP-доступа к серверу, но все удаленные изображения можно получить через HTTP (например, http://www.mydomain.com/myimage.jpg ).
Пример использования: пользователь хочет добавить изображение в свой профиль. Изображение уже существует в Интернете, и пользователь предоставляет прямой URL-адрес. Я не хочу ссылаться на изображение, но импортировать и обслуживать из своего домена.
Если на вашем сервере включена оболочка PHP5 и HTTP-потоковая оболочка, ее просто невозможно скопировать в локальный файл:
copy('http://img.ruphp.com/php/f', '/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 (), которая считывает содержимое файла в строку.
<? PHP // Получить файл $ content = file_get_contents (" http://example.com/image.jpg ");
// Хранить в файловой системе.
$ fp = fopen ("/ location / to / save / image.jpg", "w");
fwrite ($ fp, $ content);
fclose ($ FP);
?>
Если вы хотите сохранить файл в базе данных, просто используйте переменную $ content и не сохраняйте файл на диске.
У вас есть эти четыре возможности:
Удаленные файлы . Для этого нужно allow_url_fopen
в php.ini, но это самый простой способ.
В качестве альтернативы вы можете использовать cURL, если ваша установка PHP поддерживает его. Есть даже пример .
И если вы действительно хотите сделать это вручную, используйте HTTP-модуль .
Даже не пытайтесь напрямую использовать сокеты .
Вот самый простой способ:
$url = "http://img.ruphp.com/php/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://img.ruphp.com/php/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); ?>
в<?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
вы увидите в папке загрузки загрузку файла с другого сервера
благодаря
Используйте GET-запрос для загрузки изображения и сохранения его в веб-каталог, доступный на вашем сервере.
Когда вы используете PHP, вы можете использовать curl
для загрузки файлов с другого сервера.
Поскольку вы отметили свой вопрос «php», я буду считать ваш php на вашем сервере. Лучше всего, если вы контролируете свой собственный веб-сервер, а затем скомпилируете cURL в php. Это позволит веб-серверу отправлять запросы другим веб-серверам. Это может быть весьма опасно с точки зрения безопасности, поэтому большинство базовых хостинг-провайдеров не будут иметь эту возможность.
Вот страница man php при использовании cURL . В комментариях вы можете найти пример загрузки и файла изображения.
Если вы не хотите использовать libcurl, вы можете создать код с помощью fsockopen. Это встроено в php (но может быть отключено на вашем хосте) и может напрямую читать и записывать в сокеты. См. Примеры на странице man fsockopen .
Я пытался копировать / загружать удаленные файлы, используя функцию копирования behint proxy, но копия напрямую соединяется без прокси.
Я попытался установить мои настройки в качестве контекста по умолчанию и дал ему как 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));
Мой сервер работает с:
urlfopen включен HTTP и https потоки зарегистрированы для php
Для тех, кому необходимо сохранить исходное имя файла и расширение
$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>