【问题标题】:AJAX - Weird characters in img tag after request responseAJAX - 请求响应后 img 标签中的奇怪字符
【发布时间】:2017-12-23 18:20:57
【问题描述】:

我无法解决我提出的 AJAX 请求问题(顺便说一下,我是 AJAX 新手)。我有一个 API 设置,我想使用授权标头检索 png 图像,该标头使用我提供的令牌(存储在本地存储中)。因此,例如,如果我要使用 Auth 标头访问图像,那么我会这样做......

$.ajaxSetup({headers: {"Authorization" : localStorage.token}});

我能够检索图像。我可以在 Chrome 的“网络”标签中看到它,但是当我使用下面的这个将它附加到我的 div 时...

$.ajax({
    //Use commas for several parameters
    type: 'GET',
    url: *url of image*,
    contentType: 'image/png',
    success: function (data) {
    binary = data;
    $("#image").attr("src", 'data:image/png;base64,'+ data);
}

...它以这种奇怪的字符格式出现(如下所示):

div id="image" src="data:image/png;base64, PNG

IHDRww^ÀþIDATxÚìÝ|ÔWº?þ½¿ÿ½Ý.ÅâÉd2îdâ®BB ÁÝÝ )îÞbÅÝ¥TÐzi)Ô ÞRÙn»rï]»+w·{þçùÌ

我希望它以图像或 b64 字符串的形式返回,我可以简单地将其放入 src 参数中。我在网上到处搜索,似乎找不到答案。

有什么想法吗?非常感谢您的宝贵时间。

This is the response I receive

【问题讨论】:

  • 作为datasuccess 处理程序中得到什么?
  • 我得到“�PNG...etc”,其中包含大量“�”菱形字符

标签: javascript jquery html css ajax


【解决方案1】:

您的代码正在下载二进制格式的图像。

您需要将二进制文件编码为 base64 才能以 base64 显示图像。按照此答案中的说明使用 btoa:https://stackoverflow.com/a/247261/2223027

【讨论】:

  • 感谢您如此迅速的回复。我尝试使用 btoa(unescape(encodeURIComponent(binary)))) 其中“binary”是奇怪的编码字符串,实际上我确实得到了看起来是 b64 字符串,但是当我把它放在这个转换器中时 [codebeautify.org/base64-to-image-converter] ,它不显示图像。我认为它没有正确编码字符串。再次感谢 - 还有其他想法吗?
  • 嗯不知道为什么你必须同时使用unescapeencodeURIComponent。另一种方法是使用 Canvas.toDataURL() 1. 使用图像 URL 构建一个画布元素 2. 获取数据 URL(请参阅上面的链接和 stackoverflow.com/a/7101807/2223027
  • 我还能使用我的请求标头吗?图像正在通过,但我更相信它只是我需要执行的转换。我实际上查看了 Chrome 并通过了有效的 b64 字符串。我打开检查元素,转到顶部的网络选项卡,然后单击图像并选择预览,我可以看到它。我把它放在转换器中,它可以工作,但我不知道如何保存它。看看这里:tinypic.com/r/9ia3kl/9。再次感谢
  • 当你这样做时会发生什么? binary = data; base64 = btoa(binary); $("#image").attr("src", 'data:image/png;base64,'+ base64);。不,您是对的,因为您必须使用另一种方法将二进制文件编码(转换)为 base64 的标头。看FileReaderstackoverflow.com/a/20285053/2223027的第一种解决方案
  • 所以我尝试了这个并得到了与尝试使用 btoa 时相同的响应。出来的 b64 字符串与我存储在数据库中的字符串不同,因此它没有正确转换它。我得到一个空白图像。再次感谢到目前为止的所有帮助:我得到的图像 -> tinypic.com/r/2im1g8h/9
【解决方案2】:

似乎您正在获取二进制数据格式的图像文件,而不是您期望放入 img 标记 src 属性的 base64 格式。

如果你有图片 url 可以直接放到 img src 中,不需要 ajax 调用。

【讨论】:

  • 是的,我明白了。我配置一切的方式就是它的设置方式。奇怪的是,我实际上能够使用 Chrome 扩展程序“ModHeader”获取图像,我可以在其中硬编码 Authorization 标头,但是使用上面显示的内容,我似乎无法查看它: /
猜你喜欢
  • 1970-01-01
  • 2011-09-09
  • 2019-05-20
  • 1970-01-01
  • 2013-07-25
  • 2017-07-08
  • 2011-06-16
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多