Web

Сохранение изображения из 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');

}

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

Web

Tailwind CSS — что это такое и какие возможности он дает?

Web

Как я могу обезопасить вводимые пользователем данные с помощью PHP?

Web

Как вставить массив в базу данных MySQL с помощью PHP

Web

Что такое ISA Server. ISA Server простыми словами. Настройка ISA

×