ajax请求二进制流图片并渲染到html中img标签

2023-11-14

说明


后台返回图片二进制流,需要使用get请求获取返回结果,并且将返回的二进制流以图片形式显示在页面img中。
但是日常显示图片都诸如这种形式:

<img src="图片路径、地址" alt="" />

以上需求不能将后端地址直接填入src(原因是需要获取图片请求的headers中字段)

问题

后端返回图片验证码,返回验证码的请求中的headers有一个Captcha-ETag:caf9f71eb9f511e78e41020563146d69,登录请求带上它用来做验证码校验。
所以,只能在get请求获取,不能直接用直接img填写图片地址的方法。

解决

几个关键点:

  • responseType
设置值 返回类型
“” DOMString (this is the default value)
“arraybuffer” ArrayBuffer
“blob” Blob(二进制流)
“document” Document
“json” JSON
“text” DOMString

注意那个blob就是这种方案需要的responseType

  • createObjectURL
    URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。
objectURL = URL.createObjectURL(blob);
  • revokeObjectURL
    在每次调用 createObjectURL() 方法时,都会创建一个新的 URL 对象,即使你已经用相同的对象作为参数创建过。当不再需要这些 URL 对象时,每个对象必须通过调用 URL.revokeObjectURL() 方法来释放。浏览器会在文档退出的时候自动释放它们,但是为了获得最佳性能和内存使用状况,你应该在安全的时机主动释放掉它们。
window.URL.revokeObjectURL(objectURL);

createObjectURL()方法,是接收一个文件的引用返回一个URL对象。这是通知浏览器来创建和管理一个URL来加载文件。 revokeObjectURL()方法,则是销毁创建的URL,有效果释放内存。当然,所有的URL对象将在浏览器重新载入时全部被销毁,也有助于释放它们占用的内存。

最后demo:

URL 变量是原生浏览器对象的一个引用,假设浏览器支持URL对象,URL通过file创建一个对象赋值给imageUrl变量。 元素的onload 事件触发后将销毁URL 对象(一分钟内),接着,给src属性赋值后将追加到页面上(你也可以使用一个页面上已有的元素的)。

要及时销毁URL对象,除非你有多个file需要使用,所以图片加载完销毁它是最佳内存释放时机。

var xmlhttp;
xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","http://10.10.0.62:10001/api/charge/admin/v1/image/code",true);
xmlhttp.responseType = "blob";
xmlhttp.onload = function(){
    console.log(this);
    if (this.status == 200) {
        var blob = this.response;
        var img = document.createElement("img");
        img.onload = function(e) {
            window.URL.revokeObjectURL(img.src); 
        };
        img.src = window.URL.createObjectURL(blob);
        document.body.appendChild(img); 
    }
}
xmlhttp.send();

浏览器显示:

<img src="blob:null/bccc301d-f2cd-4871-9349-daaac181d722">

leason | 博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ajax请求二进制流图片并渲染到html中img标签 的相关文章

  • Arbor Js - 节点 Onclick?

    我在用着arbor js http arborjs org 创建图表 我如何创建一个onclick节点的事件 或者在单击时在某处创建节点链接 Arborjs org 主页的节点在单击时链接到外部页面 我如何复制它 或者使节点在单击时调用 j
  • Java Web 技术中的 AJAX 自动完成文本框(JSP 和 servlet)

    我需要您的帮助 了解如何使用 Java Web 技术 JSP Servlet 和 AJAX 使 HTML 输入文本元素像 Google 的 AJAX 搜索引擎 输入文本元素一样工作 下拉列表中的数据将来自数据库表 例如分别是 MySQL 或
  • Django:使用条件 {% extends %} 使 {% block "div" %} 成为条件

    我想分享一个 AJAX 和常规 HTTP 调用之间的模板 唯一的区别是一个模板需要扩展 base html html 而另一个则不需要 我可以用 extends request is ajax yesno app base ajax htm
  • 自定义 jQuery 验证 .addMethod

    我有一个表单 可以根据最小 最大长度验证邮政编码 我需要将所有国家 地区的邮政编码最小设置为 5 位数字 澳大利亚除外 澳大利亚需要为 4 位数字 这是我遇到的问题 validator addMethod AusZip function v
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • 在随机位置启动 HTML5

    我有一个大约 2 小时长的音轨 我想在我的网站上使用它 我希望它在页面加载时在随机位置开始播放曲目 使用 HTML5 可以吗 我知道您可以使用 element currentTime 函数来获取当前位置 但是如何在完全下载之前获取曲目的总时
  • 设置双指缩放时精确的滚动位置

    我正在创建一个地图应用程序 它将标记图像放置在画布上并滚动到它 我正在使用浏览器的捏缩放和滚动来放大 缩小地图 然而 我注意到有一些奇怪的行为 我想知道如何解决它 这有点难以解释 但我们开始吧 假设您处于网页的标准缩放级别 无法进一步缩小
  • JSP/Servlet HTTP 404 错误处理

    我想在我的网络应用程序中处理 HTML 404 错误 我可以这样写
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • 如何转义 HTML 字符?在.NET中-->“

    如何在 NET 中转义 HTML 字符 我正在从 json 字符串中获取 html 并在标题中得到 amp quot more text 看起来我需要做两次才能得到 amp quot 成为 quot 那么它就是一个 如何转义 NET 中的所
  • .live() 或 .livequery()

    我有一个Ajaxed的网站 Ajax的内容来自其他页面 例如about html contact html ajax 从名为 main content 的 div 获取内容 但是在 ajax 调用之后 我的其余脚本就中断了 比如tinysc
  • 如何在 select 和 option 标签中添加 JSON 数据?

    我有这个html代码 div class searchfilter div class searchwrapper div div
  • jquery 插件“uploadify”-从上传脚本返回响应的方法?

    我的标题代码 document ready function sampleFile uploadify uploader include uploadify uploadify swf script add list php scriptD
  • 使用 JQuery 禁用和启用所有超链接

    我有以下禁用所有超链接的内容 但在事件发生后我想再次启用它们 我该如何执行此操作 a click function return false 我认为这不仅仅是将其设置为 true 那么简单 谢谢大家 不要以这种方式绑定 点击 处理程序 而是
  • 销毁 JQuery 可拖动对象

    我有一组可拖动的元素 如何删除可拖动功能 draggable draggable disable 对我来说不是一个选择 draggable draggable destroy 回报Uncaught TypeError Cannot read
  • HTML 代码中的 PHP [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我用 HTML 代码编写了 PHP div div 但这出现在输出页面中 else print 我怎样才能让PHP执行 你的文件有一个 p
  • 如何通过 jQuery 中的类获取特定 html 元素的innerHTML?

    我有这样的 HTML 代码 div class a html value 1 div div class a html value 2 div 我怎样才能访问html value 1 and html value 2使用jquery 分别地
  • 如何使整个跨度落入新行?

    这个片段显示了我想要的 http jsfiddle net 945Df 3 http jsfiddle net 945Df 3 div class sup strong a href Rosario Santa Fe Argentina a
  • 将特定字形与网络字体一起使用

    使用网络字体 我想使用字体功能设置 CSS 中的选项以及跨度类HTML 中 以便使用字体集中的特定替代字形 我需要以正确的语法使用哪些值 GID Unicode 才能定位特定的目标glyph内glyph备择方案 这些功能使用 OpenTyp
  • ng-include 和 ng-view 不同时加载

    下面是我的应用程序的结构 很简单 页眉和页脚是非常小的文件 而主页上的 ng view 要大得多 当我进入该页面时 我注意到了这一点 首先加载两个 ng include 然后 ng view 出现 页脚被推到底部 页脚闪烁大约 0 1 秒

随机推荐

  • MQTT 连接优化指南

    博主猫头虎 带您 Go to New World 博客首页 猫头虎的博客 面试题大全专栏 文章图文并茂 生动形象 简单易学 欢迎大家来踩踩 IDEA开发秘籍专栏 学会IDEA常用操作 工作效率翻倍 100天精通Golang 基础入门篇 学会
  • 华为OD机试 - 数组去重和排序(Java)

    题目描述 给定一个乱序的数组 删除所有的重复元素 使得每个元素只出现一次 并且按照出现的次数从高到低进行排序 相同出现次数按照第一次出现顺序进行先后排序 输入描述 一个数组 输出描述 去重排序后的数组 用例 输入 1 3 3 3 2 4 4
  • redis-缓存架构-问题列表(四)

    1 缓存架构 高并发 高可用 解决方案 问题 1 如何让redis集群支撑几十万QPS高并发 99 99 高可用 TB级海量数据 企业级数据备份与恢复 redis企业级集群架构 2 如何支撑高性能以及高并发到极致 同时给缓存架构最后的安全保
  • Java如何将字符串放进字符串数组中(亲测)

    String str1 aaa String str2 bbb String str3 ccc List
  • oracle报错文件损坏,oracle 控制文件损坏处理

    一 故障模拟 控制文件损坏 发现关闭不了 强制关闭 故障恢复 发现已经执行到mont阶段 因为这个不依靠控制文件 进入整段日志 cd u01 app oracle diag rdbms orcl orcl trace 查看alert orc
  • Idea开启Run DashBoard配置

    找到 idea文件下的workspace xml 并找到RunDashboard
  • LeetCode:二叉搜索树的属性、修改与构造(12道经典题目)

    LeetCode 二叉搜索树的属性 修改与构造 12道经典题目 本文带来与二叉搜索树的属性 修改与构造有关的经典题目 主要实现是C 700 二叉搜索树中的搜索 98 验证二叉搜索树 530 二叉搜索树的最小绝对差 501 二叉搜索树中的众数
  • Java_Could not find resource SqlMapConfig.xml

    目录结构如图 解决办法 选中目录config 右键build path gt use as source folder
  • Linux中如何设置静态IP

    1 打开虚拟机编辑 gt 虚拟网络编辑器 选择VMnet8 设置子网IP 子网掩码 网关 点击确定 2 按照以下标注修改网卡的配置文件 gt 重启网络 gt 查询IP root centos7 vim etc sysconfig netwo
  • ECCO首家全球旗舰店在上海正式开业;海立马瑞利全球总部启动运营;西门子医疗完成收购瓦里安

    一周企业资讯看点 ECCO首家全球旗舰店正式开业 海立马瑞利全球总部启动运营 赛诺菲中国首个全球研究院落成启用 西门子医疗完成收购瓦里安 温德姆酒店集团计划今年大中华区新开超过100家酒店 Club Med丽江度假村预计将于今年秋天开业 三
  • Windows下在虚拟机VMware中安装Ubuntu 18.04(一个安装了很多次Ubuntu的详细步骤和经验,避免踩不必要的坑)

    我安装了ubuntu很多次 以前在网上学习了很多版本的安装步骤 以前经验不足 出现了很多问题 比如说 学习过程中出现内存或磁盘不足 而且有时候无法扩展或扩展很麻烦 这很浪费时间和降低学习效率 甚至Ubuntu有时会很卡 启动慢 我觉得最严重
  • ag-grid基本配置

    columnDefs headerName 序号 必填 显示在表头的文本 width 50 宽度 minWidth 300 最小宽度 多数情况是在自适应时 设置使用 maxWidth 300 最大宽度 多数情况是在自适应时 设置使用 cel
  • 设计模式(一) 工厂方法模式

    介绍 关于设计模式 大家可能已经有很多了解了 因此这里直接开始吧 首先来介绍一下工厂方法模式 它是一种创建型模式 在设计模式 可复用面向对象软件的基础中对工厂方法由如下的解释 工厂方法模式的实质是 定义一个创建对象的接口 但让实现这个接口的
  • Intellij IDEA中使用Protobuf的正确姿势

    1 proto文件语法高亮显示 需要安装Protobuf Support插件 依次点击Intellij中的 File gt Settings gt Plugins gt Browse repositories 如下所示 输入Protobuf
  • eclipse中将项目打包成jar,并启动

    第一种 利用eclipse中自带的export功能 第一种方法分两种情况先来看第一种情况 没有引用外部jar的项目打包 步骤一 右键点击项目选择导出 export 选择java gt jar文件 不是选择可运行jar文件 步骤二 选择你要导
  • python3.7 解决古代计算题--牛刀小试

    首先来看下题目 今有物不知其数 三三数之剩二 五五数之剩三 七七数之剩二 问物几何 第一代 print 今有物不知其数 三三数之剩二 五五数之剩三 七七数之剩二 问物几何 n number int input 请输入你认为符合条件的数字 i
  • 【计组笔记-5】详细测试c++中类型转换的溢出截断处理

    计组笔记 5 详细测试c 中类型转换的溢出截断处理 1 将小数赋值给float 2 将整数赋值给float 3 将整数赋值给int 3 1 算术溢出 3 2 非算术溢出 等于32位 3 3 非算术溢出 大于32位 4 将小数赋值给int 5
  • python的扩展控制鼠标

    1 使用资料 PyAutoGUI 简介 今天要介绍的工具就是 PyAutoGUI 看到这个名字 就能猜到它的作用 无非用 Python 自动处理图形界面的操作 的确是这样 你可以使用编程的方式来控制电脑的鼠标和键盘 它有两个优点 跨平台 支
  • condavalueerror: malformed version string ‘~‘: invalid character(s)解决方法

    安装python包时出现condavalueerror malformed version string invalid character s 的错误提示解决方法如下 1 使用如下命令删除之前的源 若之前没有在conda中进行换源操作 此
  • ajax请求二进制流图片并渲染到html中img标签

    说明 后台返回图片二进制流 需要使用get请求获取返回结果 并且将返回的二进制流以图片形式显示在页面img中 但是日常显示图片都诸如这种形式 img src 图片路径 地址 alt 以上需求不能将后端地址直接填入src 原因是需要获取图片请