2009-05-26 3 views
77

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

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

+0

Не серверы прокси-модули для этого? – jiggunjer

ответ

142

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

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

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

+29

Помните, что allow_url_fopen должен быть = включен в php.ini. –

+3

Комментарий allow_url_fopen просто решил за час царапин на голове. Спасибо, @ mauro.dec! –

+2

Что такое пожертвования с URL-адресами вроде этого 'http: // desmond .imageshack.us/Himg100/scaled.php? server = 100 & filename = desertoh.jpg & res = crop' ??? – zhilevan

0

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

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

2

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

+1

Это связано с локальными файловыми системами на большинстве общих хостов по соображениям безопасности.cURL лучше, быстрее, сильнее и т. д. И обычно доступно на тех хостах, которые блокируют fopen на удаленных файловых системах. – Oli

+0

Если cURL доступен, это будет еще лучше. см. cUrl at php.net PatrikAkerstrand

7

Вы должны об этих четырех возможностей:

  • Remote files. Для этого нужно указать allow_url_fopen в php.ini, но это самый простой способ.

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

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

  • Даже не пытайтесь use sockets directly.

+0

Почему «Не пытайтесь напрямую использовать сокеты»? (Это то, что я использую, https://gist.github.com/0893a7ec908ff508aac6) – Gajus

+0

@Gajus: вы не используете сокеты непосредственно в этом фрагменте. Вы используете возможности php для открытия удаленных файлов. –

4

Вот самый основной способ:

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

+1

Для проверки изображения с помощью GD рассмотрите возможность запуска этого права после сохранения файла: http://www.psoug.org/snippet/Check_if_an_image_exists_GD_364.htm - если он вернется с ошибкой, немедленно удалите файл. – Oli

+2

Вы пропустили 'curl_exec ($ ch)' перед 'curl_close ($ ch)' и 'fclose ($ ch)' должны быть помещены в конец, а не перед 'curl_close ($ ch)', что означает закрыть файл до ничего не было записано в файл, поэтому вы получите только пустой файл. –

0

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

Вот php man page on using cURL. В комментариях вы можете найти пример загрузки и файла изображения.

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

10

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

+2

Использование curl - хороший метод, потому что некоторые серверные ребята не поддерживают file_get_contents по соображениям безопасности –

+1

Хороший совет для небольших файлов, но для больших файлов php-память взорвется :( curl также не является хорошим выбором, поскольку его часть standard php – Radon8472

2

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

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

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

благодаря

26

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

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

спасибо человеку !! второе решение работает. Наверху решение для меня не работает: p – Rajnish

+4

Хороший совет для небольших файлов, но для больших файлов php-память взорвется :( – Radon8472

0

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

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

Но похоже, что контекст никогда не используется, но readfile или get_headers использовать тот же контекст успешно.

Here's мой код:

$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

-2

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

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

, пожалуйста, прочитайте вопрос перед отправкой ответа. – Steeve

0

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

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

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

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

copy($origin, $dest); 
Смежные вопросы