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

Как позволить PHP автоматически создавать поддомен для каждого пользователя

Самые полезные расширения для Google Chrome для веб-разработчика
Web

Самые полезные расширения для Google Chrome для веб-разработчика

Web

Как запустить процесс с выводом в реальном времени в PHP

Как создать грамотное оформление страницы 404 на собственном сайте
Web

Как создать грамотное оформление страницы 404 на собственном сайте

×