arraybuffer的应用,下载图片/文件等

news2024/11/24 16:28:53

在这篇文章中,我们了解了js中arraybuffer是用来存储二进制缓存的,但是都是理论知识,本篇文章来介绍一个arraybuffer应用的场景。

主要应用场景是下载文件,在ajax请求中,设置responseType = 'arraybuffer'  得到一个二进制流,然后把得到的二进制流转换成我们想要的图片、文件、或者字符串等。

下面的例子是请求一个图片,得到图片的二进制流,然后把二进制流也就是arraybuffer 转化成 base64格式的图片,在页面中展示

1、服务端的代码如下,用于读取一个图片文件,并返回arraybuffer

const fs = require('fs');
const path = require('path');
const express = require('express');
const cors = require('cors');

const app = express();
app.use(cors());

app.get('/img', async (req, res) => {
  let result = '';
	// 读取png
  //const filePath = path.resolve(__dirname, 'word.png');
	// 读取svg
  const filePath = path.resolve(__dirname, 'icon.svg');
  if (fs.existsSync(filePath)) {
    result = fs.readFileSync(filePath);
  }
  res.end(result)
});

app.listen(3000, () => console.log('Running on port 3000'));

2、前端的请求如下

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="./dist/bundle.js"></script>
    <style>
      .icon {
        width: 100px;
        height: 100px;
        border: 1px solid red;
      }
    </style>
  </head>
  <body>
    <img id="icon" class="icon" src="" />
    <script>
      const xhr = new XMLHttpRequest();
      xhr.open('get', 'http://localhost:3000/img');
      // 这个arraybuffer需要都小写
      xhr.responseType = 'arraybuffer';
      xhr.onload = function (oEvent) {
        let arrayBuffer = xhr.response;
        if (arrayBuffer) {
            let byteArray = new Uint8Array(arrayBuffer)
            // 转化成base64编码的字符串
            const buffers = window.btoa(String.fromCharCode(...byteArray))
            // png 图片
			//const base64Img = `data:image/png;base64,${buffers}`
            // svg 图片
            const base64Img = `data:image/svg+xml;base64,${buffers}`
            // 展示到页面上
            document.getElementById('icon').src = base64Img
        } 
      };
      xhr.send();
    </script>
  </body>
</html>

最终效果如下

重点知识总结

  1. ajax 请求的responseType = arraybuffer 【arraybuffer 需要都小写】
  2. 使用 Unit8Array 将 arraybuffer 二进制流转化成 定型数组【也是类数组】
  3. String.fromCharCode(),返回回由指定的 UTF-16 代码单元序列创建的字符串。
  4. window.btoa(str) 将字符串转化为base64编码的字符串
  5. base64字符串,前面拼接合法的Data URL,得到不同格式的文件, 参考data url, 参考
  6. 把base64拼接成图片/文件,要了解MIME类型,不同的图片/文件格式,需要拼接的字符串不同

 除了下载图片,同样的方法还可以用来下载pdf等各种格式的文件,只是后续不同格式的文件转化方法不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零刻 SEi12 Pro,ALL IN ONE搭建教程

一台mini的NUC能做什么&#xff1f;当然每个人的心里都会有着不同的答案&#xff0c;既然是一台Mini主机那就肯定少不了部署一个All-In-One来榨干他的性能。今天我就大家带来一个部署All-In-One的详细教程&#xff0c;希望能够对大家有帮助。 我这台机器配置是i5-1240P 16G内存…

【mpvue】mpvue-echarts echarts动态渲染、延迟加载、双轴动态计算、双轴对齐

mpvue-echarts 双轴折线案例使用echarts双轴折线图实战项目导入一、打包结果超过小程序大小限制&#xff1f;1.下载自定义echarts.js2. 引入 echarts.js![在这里插入图片描述](https://img-blog.csdnimg.cn/ff4ad6d894404e97bceff0581fc1f736.png#pic_center)3. 项目引入二、图…

蓝桥杯备赛Day4——多维数组

二维数组初始化 p[[0 for i in range(5)] for j in range(2)] #法一 p[[0]*5 for j in range(2)] #法二 s[[1,2,3],[4,5,6]] print(s) for i in range(2):for j in range(3):print(s[i][j],end ) 三维数组初始化 a[[[0 for _ in range(2)] for __ in…

RabbitMQ总结

目录 工作模式 简单模式 工作队列模式 发布订阅模式 路由模式 通配符模式 SpringBoot整合RabbitMQ 项目搭建 配置类中创建队列和交换机 编写生产者 编写消费者 消息的可靠性传递 死信队列 延迟队列 工作模式 RabbitMQ共有六种工作模式&#xff1a;简单模式&#xff08;Si…

网络编程 select模型

目录 select模型详解 select函数解释 整体代码 select模型在代码上和c/s模型的前面一部分是一样的&#xff0c;可以去看 这个https://blog.csdn.net/weixin_62859191/article/details/128397927?spm1001.2014.3001.5501&#xff0c;相同的代码如下 #define _CRT_SECURE_NO_…

cadence SPB17.4 - orcad - WARNING(ORCAP-2354) - Wire is hanging at Point

文章目录cadence SPB17.4 - orcad - WARNING(ORCAP-2354) - Wire is hanging at Point概述普通画法, 引起的不可理解的hang wire 警告ENDcadence SPB17.4 - orcad - WARNING(ORCAP-2354) - Wire is hanging at Point 概述 在使用SPB17.4从一个PCB中反推原理图. 原理图重建的差…

Jenkins入门(一)Jenkins介绍、GitLab基础环境安装

视频学习地址&#xff1a;01-Jenkins教程简介_哔哩哔哩_bilibili 一、介绍&#xff1a; Jenkins是一个独立的开源自动化服务器&#xff0c;可用于自动化各种任务&#xff0c;如构建&#xff0c;测试和部署软件。 它替代了管理员手动集成、构建、测试&#xff0c;提交代码后自…

深度学习:ResNet从理论到代码

深度学习&#xff1a;ResNet从理论到代码面临的问题模型退化问题ResNet核心思想反向传播公式推导残差的由来残差模块为什么效果好代码实现面临的问题 模型退化问题 随着网络层数加深&#xff0c;性能逐渐降低&#xff0c;但它并不是过拟合&#xff0c;因为在test error降低的同…

多准则决策问题评估方法 | 灰云模型(含代码)

目前多准则决策问题的评估方法主要分为定性分析方法和定量分析方法两类。定性分析方法主要包括专家咨询、熵权法、案例研究和德尔菲法等&#xff1b;定量分析法主要包括层次分析法、主成分分析法、因子分析法、模糊综合评价法、灰色综合评价法以及数据包络分析法&#xff08;DE…

Apollo星火计划学习笔记——Apollo路径规划算法原理与实践

文章目录1. 路径规划算法总体介绍1.1 Task&#xff1a; LANE_CHANGE_DECIDER1.2 Task&#xff1a; PATH_REUSE_DECIDER1.3 Task&#xff1a; PATH_BORROW_DECIDER1.4 Task&#xff1a; PATH_BOUNDS_DECIDER1.5 Task&#xff1a; PIECEWISE_JERK_PATH_OPTIMIZER1.6 Task&#xf…

人脸识别经典论文Arcface解读

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 研究背景 1、在人脸识别时&#xff0c;我们需要特征的discrimination 2、之前提出到的一些方法&#xff0c;如triplet loss,center loss, L-softmax,a-softmax都有一些缺陷。 3、centerloss&#xff1a;提…

2022.12.25 学习周报

文章目录摘要文献阅读1.题目2.摘要3.问题和方案4.介绍5.Attention Transfer5.1 Activation-based Attention Transfer5.2 Gradient-based Attention Transfer6.实验7.结论深度学习Attention机制的本质Encoder to Decoder抛开encoder-decoderAttention函数工作机制Attention机制…

20221225 海豚调度2.0.5连接星环库使用记录

阳阳的一周&#xff0c;算是挺过来了&#xff0c;现在只剩感冒了&#xff0c;迷迷糊糊的干了一周&#xff0c;混口饭吃不容易呀&#xff01;简单记录一下遇到的问题吧&#xff01; 连接hive(星环)数据库失败 方案一 &#xff1a; 海豚调度2.0.5使用的hive包是2.0版本,星环库包…

云原生之部署wordpress博客及设置圣诞主题风格

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ CSDN诚邀各位技术er分享关于圣诞节的各种技术创意&#xff0c;展现你与众不同的精彩&#xff01;参与本次投稿即可获得【话题达人】勋章【圣诞快乐】定制勋章&#xff08;1年1次&#xff0c;错过要等下一年喔&#…

Python的条条框框

Python的条条框框 了解编程语言的分类 从运行角度的分类 从运行角度来看&#xff0c;编程语言的类型可以分为两种&#xff1a;编译型和解释型。 Python属于解释型语言。 解释型语言&#xff1a; 代码可以直接运行。当然&#xff0c;这也是依赖于附加程序&#xff08;解释器&…

【VUE3】保姆级基础讲解(三)非父子组件通讯,$refs,动态组件,keep-alive,Composition API

目录 非父子组件通讯 全局事件总线mitt库 组件的生命周期 $refs 动态组件 keep-alive 异步打包 v-model绑定组件 Composition API 定义响应式数据 readonly toRefs与toRef computed $ref 生命周期钩子 provide和inject watch侦听 watchEffect script setup语法…

C++必须掌握的知识点

面向对象的三大特性 封装 继承 父类中所有的非静态成员都会被子类继承下去&#xff0c;只是父类的私有成员被编译器屏蔽了&#xff0c;访问不到。可以利用开发人员工具查看对象模型继承中&#xff0c;先构造父类&#xff0c;再构造子类&#xff0c;析构的顺序和构造的顺序完…

QT系列第8节 自定义对话框

在实际业务开发中经常要有各种各样的对话框来处理用户信息&#xff0c;本节就结合例子来说明如何自定义对话框。 目录 1.创建对话框 2.创建非模态对话框 3.创建模态对话框 4.综合案例 1.创建对话框 &#xff08;1&#xff09;项目鼠标右键菜单 - 添加新文件 &#xff08;…

Hexo + Butterfly 自定义页脚

原文链接 &#xff1a;Hexo Butterfly 自定义页脚 推荐阅读 基于 Hexo 从零开始搭建个人博客&#xff08;一&#xff09;: 环境准备基于 Hexo 从零开始搭建个人博客&#xff08;二&#xff09;: 项目初识基于 Hexo 从零开始搭建个人博客&#xff08;三&#xff09;: 主题安装…

CSDN每日一练最长递增的区间长度 C语言

题目名称&#xff1a;最长递增的区间长度 时间限制&#xff1a;1000ms 内存限制&#xff1a;256M 题目描述 给一个无序数组&#xff0c;求最长递增的区间长度。如&#xff1a;[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3 &#xff08;注意&#xff1a;测试用例仅做参考&#xff0c;…