Вернуться




Сохранение изображения из URL-адреса в PHP



Мне нужно сохранить изображение с URL-адреса PHP на свой компьютер. Допустим, у меня есть страница, http://example.com/image.php, содержащая какое-либо изображение, ничего больше. Как я могу сохранить это изображение из URL-адреса с новым именем (используя PHP)?

 

Ответ 1

Если вы установили allow_url_fopen в true:

$url = 'http://example.com/image.php';

$img = '/my/folder/flower.gif';

file_put_contents($img, file_get_contents($url));

 

В противном случае используйте curl:

$ch = curl_init('http://example.com/image.php');

$fp = fopen('/my/folder/flower.gif', 'wb');

curl_setopt($ch, CURLOPT_FILE, $fp);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);

curl_close($ch);

fclose($fp);

 

 

Ответ 2

Итак, данный пример сохраняет удаленное изображение как image.jpg:

function save_image($inPath,$outPath) {

    //Скачать изображение с удаленного сервера

    $in=    fopen($inPath, "rb");

    $out=   fopen($outPath, "wb");

    while ($chunk = fread($in,8192)) {

        fwrite($out, $chunk, 8192);

    }

    fclose($in);

    fclose($out);

}

save_image('http://www.someimagesite.com/img.jpg','image.jpg');

 

Ответ 3

Например, так: когда на сервере есть перенаправление (например, когда вы пытаетесь сохранить изображение профиля facebook), вам понадобится следующий набор параметров:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Полное решение становится таким:

$ch = curl_init('http://example.com/image.php');

$fp = fopen('/my/folder/flower.gif', 'wb');

curl_setopt($ch, CURLOPT_FILE, $fp);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

curl_exec($ch);

curl_close($ch);

fclose($fp);

 

 

Ответ 4

Ни в одном из ответов здесь не упоминается тот факт, что изображение с URL-адреса может быть сжато (gzip), и ни один из ответов не сработает в этом случае.

Есть два решения, которые помогут вам обойти это:

Первое — использовать метод cURL и установить curl_setopt CURLOPT_ENCODING, '':

// ... проверка изображений ...

// Автоматически обрабатывать сжатие и перенаправление

$ch = curl_init($image_url);

$fp = fopen($dest_path, 'wb');

curl_setopt($ch, CURLOPT_FILE, $fp);

// Исключить данные заголовков

curl_setopt($ch, CURLOPT_HEADER, 0);

// Выполнить перенаправление

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

// Автоматическое определение декодирования ответа - identity, deflate, или gzip

curl_setopt($ch, CURLOPT_ENCODING, '');

curl_exec($ch);

curl_close($ch);

fclose($fp);

 

Это работает, но при выполнении сотни тестов различных изображений (png, jpg, ico, gif, svg) это является не самым надежным способом. Лучше всего сработало определение того, имеет ли url изображения кодировку содержимого (например, gzip):

// ... проверка изображений ...

// Получение всех заголовков из URL

$data = get_headers($image_url, true);

// Проверка, установлена ли кодировка содержимого

$content_encoding = isset($data['Content-Encoding']) ? $data['Content-Encoding'] : null;

// Установить флаг декодирования gzip

$gzip_decode = ($content_encoding == 'gzip') ? true : false;

 

if ($gzip_decode) {

    // Получить содержимое и использовать gzdecode для "разархивирования" данных

    file_put_contents($dest_path, gzdecode(file_get_contents($image_url)));

} else {

    // Использовать метод копирования

    copy($image_url, $dest_path);

}

 

Ответ 5

$img_file='http://www.somedomain.com/someimage.jpg'

$img_file=file_get_contents($img_file);

$file_loc=$_SERVER['DOCUMENT_ROOT'].'/some_dir/test.jpg';

$file_handler=fopen($file_loc,'w');

if(fwrite($file_handler,$img_file)==false){

    echo 'error';

}

fclose($file_handler);

 

 

Ответ 6

Мне не удалось заставить работать какие-либо другие решения, но я смог использовать wget:

$tempDir  = '/download/file/here';

$finalDir = '/keep/file/here';

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

exec("cd $tempDir && wget --quiet $imageUrl");

if (!file_exists("$tempDir/image.jpg")) {

    throw new Exception('Ошибка при попытке скачать изображение');

}

if (rename("$tempDir/image.jpg", "$finalDir/new-image-name.jpg") === false) {

    throw new Exception('Ошибка при попытке переместить файл изображения из temp_dir в final_dir');

}



Если вам понравилась эта статья поделитесь ею с друзьями, тем самым вы помогаете нам развиваться и добавлять всё больше интересного и полезного контента!




Cхожие статьи





Какой хостинг выбрать для сайта

Какой хостинг выбрать для сайта

Для беспроблемного функционирования сайта на просторах интернета необходимо ...

15 Февраля 2021    Web

Как и на чём лучше писать сайты?

Как и на чём лучше писать сайты?

Каждый начинающий сайтостроитель мечтает создать свой уникальный сайт на ко ...

21 Февраля 2021    Web

Ищем качественный и недорогой хостинг? Тогда вам сюда

Ищем качественный и недорогой хостинг? Тогда вам сюда

Рано или поздно всем вебмастерам приходится искать хостинг для своего проек ...

21 Февраля 2021    Web



Напишем