Бинарные данные php

362
20 сентября 2017, 13:16

Есть картинка в виде бинарных данных взятых из базы (тип поля image), как из них получить картинку и вывести в верстку?

Answer 1

Простых вариантов вижу два:

Вариант 1: Подготовить отдельный скрипт image.php, которому в URL передавать идентификатор изображения, например ID или имя файла. В таком случае код HTML будет выглядеть так:

<img src="/path/image.php?id=1234" />

или например

<img src="/path/images/1234/Name_Of_Image_In_Human_Readable_Format.png" />

если вы используете ЧПУ в каком-то виде

При загрузке страницы браузер обнаружит такую ссылку и обратится к ней, ожидая в ответе увидеть изображения. Задача скрипта - по принятому идентификатору найти изображение в БД и вывести его обычным print. ВНе забываем еще поменять Content-Type, например вот так: https://stackoverflow.com/a/2634072, чтобы браузер понял, что именно он прочитал

Выводить данные из БД в поток вывода очень просто. Насколько я понял, в БД они у вас хранятся в бинарном виде, соответственно их нужно получить из БД. PHP хранит бинарные данные в виде бинарных же строк. Выводить их нужно через fwrite http://php.net/manual/en/function.fwrite.php

$binary_string = (...); // Тут каким-то образом извлекается строка, замените на свой код
fwrite(STDOUT, $binary_string); // Пишем в стандартный поток вывода, открывать его не нужно
// Закрывать стандартный поток вывода тоже не нужно

STDOUT в данном случае это стандартный поток вывода: http://php.net/manual/ru/features.commandline.io-streams.php

Этот вариант также интересен тем, что можно подсчитать статистику обращений к изображению, модифицировать изображение на лету (наложить watermark, например), а также можно учесть права пользователей на просмотр изображения, и для пользователя без доступа выдавать другое изображение или заглушку

Вариант 2: Использовать Base64 URI:

$file = "icon.gif";
if($fp = fopen($file,"rb", 0))
{
   $picture = fread($fp,filesize($file));
   fclose($fp);
   // base64 encode the binary data, then break it
   // into chunks according to RFC 2045 semantics
   $base64 = chunk_split(base64_encode($picture));
   $tag = '<img ' . "n" .
          'src="data:image/gif;base64,' . $base64 .
          '" />';
   echo $tag;
}

В итоге получится что-то вроде такого:

<img
src="data:image/gif;base64,R0lGODlhUAAPAKIAAAsLav///88PD9WqsYmApmZmZtZfYmdakyH5BAQUAP8ALAAAAABQAA8AAAPb
WLrc/jDKSVe4OOvNu/9gqARDSRBHegyGMahqO4R0bQcjIQ8E4BMCQc930JluyGRmdAAcdiigMLVr
ApTYWy5FKM1IQe+Mp+L4rphz+qIOBAUYeCY4p2tGrJZeH9y79mZsawFoaIRxF3JyiYxuHiMGb5KT
kpFvZj4ZbYeCiXaOiKBwnxh4fnt9e3ktgZyHhrChinONs3cFAShFF2JhvCZlG5uchYNun5eedRxM
AF15XEFRXgZWWdciuM8GCmdSQ84lLQfY5R14wDB5Lyon4ubwS7jx9NcV9/j5+g4JADs=
"  />

Этот вариант не прокатит с браузерами старше IE 8, будьте внимательны. Также есть отрицательные эффекты размера HTML, если у вас галерея на 20+МБ будет выдаваться таким образом в виде одного огромного HTML-файла, будут проблемы с просмотром на слабом соединении и перерасход памяти браузера. Также могут быть отрицательные эффекты кеширования - такие изображения не могут быть кешированы бразуером, тогда как изображения, полученный через URL src в Варианте 1 будут кешироваться без проблем

Подробнее: http://www.skillz.ru/dev/php/article-Base64_img_v_HTML.html

Я бы советовал пойти вам первым вариантом, он более каноничен и гибок, и также содержит минимум отрицательных эффектов

Answer 2

В случае простых изображений вам нужно указать mime-тип для них (например, image/gif), за ним идет base64-представление бинарного файла с изображением. Ниже приведен пример (переводы строк добавлены, чтобы не разрывать страницу, на самом деле, их нет):

<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0j
vb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAA
Re8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0Cc
guWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" width="16" 
height="14" alt="внедренная иконка папки"/>
READ ALSO
PHPunit тест для функции

PHPunit тест для функции

Есть функция f(), не принимающая параметров и содержащая другие функции f1, f2, f3, f4, expectДругие функции (f1, f2, f3, f4, expect) описаны в подключаемом файле

200
PHP TelegramBotApi Client error

PHP TelegramBotApi Client error

Подскажите в чем ошибка?

426
Как получить все поля, кроме одного, используя scenarios в Yii2?

Как получить все поля, кроме одного, используя scenarios в Yii2?

Нужно сделать так, чтобы при получении данных из формы мы писали в базу все полученные данные, кроме одногоНапример, у нас есть в форме 3 поля:...

263
помогите, почему не работает перевод из 16 в 10 систему

помогите, почему не работает перевод из 16 в 10 систему

при вводе числа AA в 16и ричнной системе выдаёт не 170 а 160

274