Конвертировать фактическое изображение в base64 в Ruby - PullRequest
1 голос
/ 23 января 2020

Мы используем конечную точку Rest, которая возвращает фактическое изображение, например, так:

@image = RestClient.get('http://example.com/api/v1/scopes/12345/icon', headers).body

И ответ выглядит примерно так:

�PNG

���
IHDR���������H�۱���PLTE������� ��/��>��M��\��j��y������������������������������������������5��J��c�����������������3��i��������������:��Z��z�����������C��e��������������.��V��~���������(��U����������@��r�����K��|����������
��B��w���������+��f����*����E��������O������������T�������<����������F����������b��1�܀�����0����?�� �֟��N��S���������L�������������W��������m������s��������;��l��k��%�ڑ�����o��n����4��������`�����_�����؊���ْ�����$�����"�ڜ�������ց��d��������������!�ڥ��g�����������x��I�����և����X���ن�����H��,�ۿ����������p��)�����#��������D��}����h��8�ݝ��������2�ܳ��[������'��t��9��q��a������]��������6��������{�����������������
��u����-��7��P�����A��^����������������������R����=��Y��Q��&�ڼ�����G��v���بxi���=�IDATx���a�����ݳm�����3�L

Мы Вы хотите, чтобы Base64 закодировал это и отобразил его в View в нашем приложении Rails:

<%= image_tag(Base64.encode(@image)) %>

Однако кажется, что Base64 ожидает, что мы откроем файл и передадим это ... например

<%= image_tag(Base64.encode(File.open(@image).read)) %>

Но этот API возвращает реальное изображение ...

Пробовал также с использованием send_data ...

Base64.encode64(send_data(RestClient.get('http://example.com/api/v1/scopes/12345/icon', headers).body, disposition: 'inline'))

Но затем просто отправляет изображение в браузер и игнорирует наше представление ...

Как мы можем Base64 кодировать и отображать это изображение в нашем представлении?

1 Ответ

4 голосов
/ 23 января 2020

Преобразование двоичных данных в base64 и передача их в качестве источника данных само по себе недостаточно. Это приведет к:

<img src="asdf...sdf==" />

, который не является допустимым источником.

Вам необходимо создать URI данных :

<%= image_tag("data:image/png;base64,#{Base64.encode64(@image)}") %>

Предполагается, что ваши данные имеют тип MIME image/png. Вы могли бы сделать это Dynami c, но вы должны каким-то образом извлечь MIME-тип из файла или расширения.

Вы также можете опустить MIME-тип, поскольку он необязателен для URI данных. Я не уверен, как веб-браузер отреагирует на это:

<%= image_tag("data:;base64,#{Base64.encode64(@image)}") %>

Вы также можете создать помощника для этого. У конвейера активов уже есть помощник asset_data_uri. Однако, поскольку вы извлекаете изображения динамически, они не являются частью ресурсов сервера stati c, поэтому вы не сможете их использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...