Javascript 如何从Rails应用程序发送Base64编码图像并显示图像

Javascript 如何从Rails应用程序发送Base64编码图像并显示图像,javascript,jquery,html,ruby-on-rails,ajax,Javascript,Jquery,Html,Ruby On Rails,Ajax,我试图在另一个网站上显示rails应用程序公共目录中托管的图像。我基本上不希望用户能够在浏览器中键入图像标记的src,并访问可以找到图像的我的应用程序的uri 在做了一些挖掘之后,我确定实现这一点的方法可能是将图像作为base64编码的数据发送,然后从接收ajax响应的网站上的数据重建图像。如果我弄错了,请告诉我 我已经通过ajax成功地将rails应用程序中的base64数据发送到了我的网站,但是我很难从数据中构建图像 这是我的rails代码: def send_image(blank=nil

我试图在另一个网站上显示rails应用程序公共目录中托管的图像。我基本上不希望用户能够在浏览器中键入图像标记的src,并访问可以找到图像的我的应用程序的uri

在做了一些挖掘之后,我确定实现这一点的方法可能是将图像作为base64编码的数据发送,然后从接收ajax响应的网站上的数据重建图像。如果我弄错了,请告诉我

我已经通过ajax成功地将rails应用程序中的base64数据发送到了我的网站,但是我很难从数据中构建图像

这是我的rails代码:

def send_image(blank=nil)
  require 'base64'
  @image= "#{Rails.root}/public/test.jpg"
  @imageEncoded = Base64.encode64(@image)

send_data @imageEncoded, :type => 'text/plain', disposition: "inline", :x_sendfile=> true

end 
这是ajax响应:

    L2FwcC9wdWJsaWMvcHVwcHkuanBn
    $("#picture").attr("src","data:image/jpg;base64," + data);
这是从ajax响应构建图像的代码:

    L2FwcC9wdWJsaWMvcHVwcHkuanBn
    $("#picture").attr("src","data:image/jpg;base64," + data);
我想我可能误解了这一切是如何运作的。当我返回endcoded数据并将其插入src时,不会显示图像。它只是显示一个损坏的图像图标

如果我只发送图像文件本身(不编码数据),当我查看开发人员工具的网络选项卡时,图片会显示在ajax响应中,但我无法使用该数据构建图像。数据响应如下所示:

    ���� :ExifMM*  � s � � � ( 1 � 2 ҇i � -��' -��' Adobe Photoshop CS5 Macintosh2015:05:20 15:25:20 � 0221� ��� �� � n v ( ~ �H H ����Adobe_CM �� Adobed� ���        �� x� " �� �� ? 3 ! 1 AQa "q�2 ���B#$ R�b34r��C %�S���cs5 ���&D�TdE£t6 �U�e���u��F'���������������Vfv��������7GWgw�������� 5 !1 AQaq" 2�� ��B#�R��3$b�r��CS cs4�% ��� &5��D�T� dEU6te����u��F���������������Vfv��������'7GWgw������� ?�T�I%)$�IJI$�R�I$���I%)$�IJI$�R�I$���I%)$�IO���T�I%)$�IJI #&� .�dž�J��ɶ��0?ю Ys� o.̘�J~ �z�Ugk �Ø� iU~u�: ��* >� � hL�^� HЎ$*Y9��;��ѵ ��_7I���� �� [� � � � � HI ��K�D�� c ӈ�uQ� � a��;C���;\�} s V%e��)��lm���K r_�-�\��i�IT�/�sa�A�Q�z��1*�r�@ wk�H ��!�� ~��� �O�DN ���7 I$�B�I$�����T�I%) /)��op�th�(� ���2KX k=�?�Qg�����@Ɇ s��԰ �� k��* u�%���\�W��Oc��� ϱ�Ǭ�y��=�� i?�z1�� A�+�<��Vvo� Q��Z� / �c� �����Of�+�5�hy2����; � ���:Ů=c���W]m kˁ��m{v��Ќx�t�e d[���7# ��6ڈp�S � � �Nr�!� N��X8�{�w=�p ��#��+��u�>Ө�S���� ��n����i� � �� B�C�5�'� y ��t�t��� kH �.�^�'� ���/ � ������X���-��-�i>+3�P�.nѸ q� � ��T*$�uu��{���;Lhc�7} ��ަ����X���㸏 �n�_K�ߣi�q �
*根据你的评论,这就是我不清楚如何进行的地方。我以前从未用过fetch。我查阅了一些关于fetch的文档,看起来您应该传递到fetch中的第一个参数是url。你是说我必须打开一个XMLHttpRequest,然后还要使用fetch吗?或者fetch应该替换XMLHttpRequest

我只是在这里猜测正确的语法:

fetch()
 .then(
     response => response.blob()
  )
*这里好像少了点什么


**在这一点上,我不知道如何获得blobURL。我知道如何设置图像的src,但我需要先完成其他步骤。

“当我查看开发人员工具的“网络”选项卡时,ajax响应中会显示图片,但我无法使用该数据构建图像。”图像已经构建,不是吗?响应是否为有效的
JPEG
?您可以创建一个JSFIDLE或plnkr,其中包含完整的
base64
响应吗?这就是我发送图像而不进行编码时发生的情况。网络选项卡中的响应显示图片、文件名、尺寸和MIME类型:image/jpg。如果我右键单击GET响应并选择“在新选项卡中打开”,我就可以访问URI(我不想要)。如果我对数据进行编码然后发送,我得到的响应是text/plain(我在帖子中给出的响应)。如果图像已经生成(使用第一种方法:不编码发送图像),如何显示它?如果我只是将数据响应插入到一个div中,它会显示我在帖子中放置的奇怪符号墙。不了解问题是什么?为什么不简单地用图像文件响应呢?您是否使用
jQuery.ajax()
请求图像<默认情况下,code>jQuery.ajax()不支持二进制数据传输。看,我的部分问题是想知道我所尝试的是否可行。我不希望用户能够下载我的图片。理论上,我正在尝试将我的图像转换为rails应用程序上的数据,将数据发送到我的网站,然后根据数据重建图像,这样就没有可以访问的uri来查看图像。但是关于你的问题,我不知道如何用图像文件来回答。如前所述,如果我从rails发送一个图像,然后编写如下内容:document.getElementById(“container”).innerHTML=data;容器将有一堵奇怪的符号墙。通过查看您提供的第二个链接中的选中答案,我使用
Blob
获得了要显示的图像。非常感谢你的帮助!“当我查看开发工具的“网络”选项卡时,ajax响应中显示了该图片,但我无法使用该数据构建图像。”图像已经构建,不是吗?响应是否为有效的
JPEG
?您可以创建一个JSFIDLE或plnkr,其中包含完整的
base64
响应吗?这就是我发送图像而不进行编码时发生的情况。网络选项卡中的响应显示图片、文件名、尺寸和MIME类型:image/jpg。如果我右键单击GET响应并选择“在新选项卡中打开”,我就可以访问URI(我不想要)。如果我对数据进行编码然后发送,我得到的响应是text/plain(我在帖子中给出的响应)。如果图像已经生成(使用第一种方法:不编码发送图像),如何显示它?如果我只是将数据响应插入到一个div中,它会显示我在帖子中放置的奇怪符号墙。不了解问题是什么?为什么不简单地用图像文件响应呢?您是否使用
jQuery.ajax()
请求图像<默认情况下,code>jQuery.ajax()不支持二进制数据传输。看,我的部分问题是想知道我所尝试的是否可行。我不希望用户能够下载我的图片。理论上,我正在尝试将我的图像转换为rails应用程序上的数据,将数据发送到我的网站,然后根据数据重建图像,这样就没有可以访问的uri来查看图像。但是关于你的问题,我不知道如何用图像文件来回答。如前所述,如果我从rails发送一个图像,然后编写如下内容:document.getElementById(“container”).innerHTML=data;容器将有一堵奇怪的符号墙。通过查看您提供的第二个链接中的选中答案,我使用
Blob
获得了要显示的图像。非常感谢你的帮助!