Явное преимущества этого формата передачи данных является текст. Для загрузки изображения на сервер вам нужно передать на сервер изображение, потом обработать его на ошибки и лишь потом сохранить на сервер. Что мы получаем конвертируя в base64, мы получаем текст и уже передаем на сервер не файл, а обычный текст. Обработка текста происходит гораздо легче чем обработка файлов.
Наглядный пример кода приведен ниже:
$str = "Строка в кодировке UTF-8";
echo base64_encode($str);
Результат выполнения данного примера:
0KHRgtGA0L7QutCwINCyINC60L7QtNC40YDQvtCy0LrQtSBVVEYtOA==
Мы избавились от загрузки файлов на сервере.
Где это может пригодится?
У нас есть Админка и модуль фотогалереи, но вот сюрприз папка куда нужно загружать картинки стоит с блокировкой на запись и у нас уже не получается загрузить изображения, согласитесь досадно. Тут мы решила обойти блокировку довольно хитрым способом, загружаем документ на сервер и если сервер нам отвечает что стоит блокировка на запись мы ковертируем в base 64 и сохраняем в базу данных.
Ни чего гениального в этом нет но очень удобно, ну и как всегда не обошлось без подводных камней. Когда мы попытались вывести на странице быльше 30 изображений из таблице, оказалось что наша идея оказалась очень плохой. Страница долго загружалась, было принято решение конвертить на лету изображения обратно в обычный файл.
На заметку кто связан с твиттером знают, что для создания статьи нужно прописать для статья мета теги и также указать изображения для статьи. К чему я вспомнил про твиттер, он может прочитать картинку только если она файл, base64 он не воспринимает и как вы догадались именно на этом проекте нам
понадобилось выводить твиты. Решением было конвертация в онлайн режиме:
Главная страница метатеги:
<!-- TWITER -->
<meta name="twitter:site" content="@evostyleru">
<meta name="twitter:creator" content="@evostyleru">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="<?php echo $twitter["meta-head"]; ?>">
<meta name="twitter:description"
content="<?php echo $twitter["description"]; ?>">
<meta name="twitter:image:src"
content="https://www.evo-style.ru/images/twitter.php?link=<?php echo $twitter["id"]; ?>" >
<meta name="twitter:image:width" content="435">
<meta name="twitter:image:height" content="375">
Ну и конечно реализация самой картинки:
include $_SERVER["DOCUMENT_ROOT"]."/bd.php"; // База данных
$t=mysql_query("SELECT `icon` FROM `page` WHERE `id`=".$_GET["link"]." LIMIT 1 ");
if(mysql_num_rows($t)>0) { $s=mysql_fetch_assoc($t); }
$icon = $s["icom"];
$size = getimagesize($icon); // если это изображение и у него определён размер, то продолжаем
if ($size){
// ОПРЕДЕЛЯЕМ МАКСИМАЛЬНЫЕ ШИРИНУ И ВЫСОТУ ИЗОБРАЖЕНИЯ
$width = 438; $height = 220;
header("Content-type: image/jpeg");
// ПОЛУЧАЕМ НОВЫЕ РАЗМЕРЫ
list($width_orig, $height_orig) = getimagesize($icon);
if ($width && ($width_orig < $height_orig)) {
$width = ($height / $height_orig) * $width_orig;
} else {
$height = ($width / $width_orig) * $height_orig;
}
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($icon);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
imagejpeg($image_p, null, 100);
// удаляем изображение
unlink ($icon);
} else {
// ну и если что то полшло не так
exit("Загружаемый файл не изображение...");
Все было хорошо обошли этот баг, но радоваться долго не пришлось, могазин в котором было 850 товаров просто перегрузил нашу базу такими картинками и пришлось вновь искать выход из сложившийся ситуации. И было принято решение ковертировать все товары из base 64 в обычные файлы.
Конвертация из base 64:
function base64_to_jpeg( $base64_string, $output_file ) {
$ifp = fopen( $output_file, "wb" );
fwrite( $ifp, base64_decode( $base64_string) );
fclose( $ifp );
return( $output_file );
}
$image = base64_to_jpeg( $my_base64_string, "tmp.jpg" );
В конце подводя итог новых технологий мы все же нашли применение данной конвертации.
С помощью явы мы загружаем картинку с предварительным просмотром и уже на сервере декодируем 64 в обчный файл.
Если у вас есть более интересные примеры использования будем рады если вы ими поделитесь с нами.