vue:处理base64格式文件pdf、图片预览

一、需求:后端返回是base64数据,需要前端处理来展示文件。

二、实现方法:

解释一下这段代码的功能:

  1. preview(item) 是一个函数,接受一个参数 item,其中包含了文件的相关信息。

  2. )首先,通过条件语句 if (item.type == 'pdf') 检查文件类型是否为 'pdf'。

  3. )如果文件类型是 'pdf',则执行以下操作:

    • 使用 webAPI.server.get() 方法发送一个请求,请求的URL是通过 this.previewUrl.format(item.id) 构建的。
    • 在请求成功后,使用 then 处理响应数据,将返回的 base64 字符串解码为字节数组。
    • 创建一个表示 PDF 文件的 Blob 对象,然后通过 URL.createObjectURL(blob) 创建一个用于在浏览器中预览的 URL。
    • 最后,调用 parent.layerAPI.openResultWin() 打开一个窗口,显示文件名和预览的文件 URL。(这一步对应第3点的代码)
  4. )如果文件类型不是 'pdf',则继续检查是否属于图像格式('png', 'gif', 'jpg', 'bmp', 'svg')。

  5. )如果文件类型是图像格式,执行以下操作:

    • 与 'pdf' 类似,发送一个异步请求获取文件内容,并处理响应数据。
    • 解码 base64 字符串为字节数组,创建一个表示图像的 Blob 对象。
    • 使用 URL.createObjectURL(blob) 创建用于在浏览器中预览的 URL。
    • 使用 this.$nextTick() 来确保在组件更新后执行代码。
    • 最后,如果存在 this.$refs.myImg,将图像的 showViewer 属性设置为 true,用于显示图像查看器。
    •   <el-image

            class="my-img"

            v-if="imageUrl"

            ref="myImg"

            :src="imageUrl"

            :preview-src-list="[imageUrl]"

          >

          </el-image>

  6. )如果文件类型既不是 'pdf' 也不是图像格式,则可能会显示一条警告消息,(// this.$message.warning('暂不支持该格式预览');)。

总体而言,该函数用于处理文件预览的逻辑,支持预览 'pdf' 文件和一些图像格式。

   <iframe
            width="100%"
            height="604px"
            :src="PDFUrl"
             v-if="PDFUrl"
       />



   handleInitPDF() {
      webAPI.server
        .get({
          url: this.getPdfUrl.format(this.id),
        })
        .then((res) => {
          if (res.code == 0) {
            if (res.data) {
              const base64Str = res.data;
              const byteCharacters = atob(base64Str);
              const byteNumbers = new Array(byteCharacters.length);
              for (let i = 0; i < byteCharacters.length; i++) {
                byteNumbers[i] = byteCharacters.charCodeAt(i);
              }
              const byteArray = new Uint8Array(byteNumbers);
              const blob = new Blob([byteArray], { type: 'application/pdf' });
              this.newurl = URL.createObjectURL(blob);
             
            }
            this.PDFUrl = this.newurl;
           
          }
        });
      this.PDFvisiable = true;
    },

 三、如果要直接打开弹窗,与预览图片:

通俗的理解为:计算机是无法直接对base64数据进行处理的,不论是其他类型字符串、数字什么的也好,计算机可以理解的语言其实是二进制数据。因此我们需要将信息转化成计算机可以理解的二进制数据,所以需要先解码,此时我们得到的是原始的二进制 数据,但是由于我们最终需要的是一个url,因此我们需要继续对这个原始二进制数据处理。首先使用Unicode 编码,这一步是为了处理一些特殊的文件格式,比如 PDF,可能某些文件格式使用非常规的编码方式,需要在 JavaScript 中进行适当的转换,以便后续处理。接着类型化数组来表示二进制数据,再将类型化数组(如 Uint8Array)转换为 Blob 对象,因为类型化数组处理过的数据会更适合blob方法处理会更高效,Blob 对象是一种表示二进制大对象的标准化方式,此时我们得到的二进制数据就是标准化的我们所需要的二进制计算机可以理解的数据了,就可以使用方法得到url了。

   preview(item) {
      if (item.type == 'pdf') {
        webAPI.server
          .get({
            url: this.previewUrl.format(item.id),
          })
          .then((res) => {
            const base64Str = res.data;
            const byteCharacters = atob(base64Str);
            const byteNumbers = new Array(byteCharacters.length);
            for (let i = 0; i < byteCharacters.length; i++) {
              byteNumbers[i] = byteCharacters.charCodeAt(i);
            }
            const byteArray = new Uint8Array(byteNumbers);
            const blob = new Blob([byteArray], { type: 'application/pdf' });
            this.fileUrl = URL.createObjectURL(blob);
            parent.layerAPI.openResultWin(    //直接打开弹窗
              '查看文件:' + item.fileName,
              this.fileUrl
            );
          });
        return;
      }
      let imgFormat = ['png', 'gif', 'jpg', 'bmp', 'svg'];
      if (imgFormat.includes(item.type)) {
        webAPI.server
          .get({
            url: this.previewUrl.format(item.id),
          })
          .then((res) => {
            const base64Str = res.data;
            const byteCharacters = atob(base64Str);
            const byteNumbers = new Array(byteCharacters.length);
            for (let i = 0; i < byteCharacters.length; i++) {
              byteNumbers[i] = byteCharacters.charCodeAt(i);
            }
            const byteArray = new Uint8Array(byteNumbers);
            const blob = new Blob([byteArray]);
            this.imageUrl = URL.createObjectURL(blob);
            this.$nextTick(() => {
              if (this.$refs.myImg) {
                this.$refs.myImg.showViewer = true;
              }
            });
          });
        return;
      }
      // this.$message.warning('暂不支持该格式预览');
    },

四、详细解释一下具体的使用到的函数方法:

1)atob()

在JavaScript中,atob() 函数用于解码Base64编码的字符串。在这里,const byteCharacters = atob(base64Str); 这一行代码的目的是将Base64编码的字符串 base64Str 解码为原始的二进制数据,存储在 byteCharacters 变量中。

解释一下具体的步骤:

  1. atob() 函数是Base64解码函数,它接受一个Base64编码的字符串作为参数,并返回解码后的原始二进制数据。

  2. base64Str 是一个包含Base64编码数据的字符串,通常是从服务器端获取的文件内容以Base64编码的形式传输。

  3. 调用 atob(base64Str) 将Base64编码的字符串解码为原始的二进制数据,并将结果存储在 byteCharacters 变量中。

在文件预览的上下文中,这一步是为了将服务器返回的Base64编码的文件内容解码为原始二进制数据,以便后续可以处理和使用这些数据,比如创建Blob对象用于文件预览。

2)new Array()

在这一步 const byteNumbers = new Array(byteCharacters.length); 中,代码创建了一个新的数组 byteNumbers,其长度为 byteCharacters.length。这一步的意义和作用:

  1. byteCharacters 是之前通过 atob() 函数解码得到的原始二进制数据,通常是代表文件内容的字节数据。

  2. byteCharacters.length 返回 byteCharacters 数组的长度,即字节数。

  3. new Array(byteCharacters.length) 创建了一个新的数组,其长度为 byteCharacters.length。这个数组用于存储将字节数据转换为数字的结果

  4. 在 JavaScript 中,new Array(length) 创建一个具有指定长度的新数组。在这里,我们使用 byteCharacters.length 作为数组的长度。

这一步的目的是为了准备一个数组,以便后续将字节数据转换为数字。每个元素将用于存储一个字节的数值。这通常是为了进一步处理二进制数据,例如将它们用于创建 Blob 对象、ArrayBuffer 等。后续代码可能会遍历字节数据,将每个字节的数值存储在数组中的相应位置。

3)charCodeAt()

这个循环的目的是遍历 byteCharacters 数组中的每个字符,获取每个字符的 Unicode 编码,并将这些编码存储到 byteNumbers 数组中。意义和作用:

  1. for 循环通过变量 i 从 0 开始逐步增加,直到 byteCharacters.length - 1。这样可以遍历 byteCharacters 数组中的每个字符。

  2. byteCharacters.charCodeAt(i) 是一个字符串方法,它返回给定位置(索引 i)的字符的 Unicode 编码。Unicode 编码是一个数字,表示字符在 Unicode 字符集中的位置

  3. 对于每个字符,循环将其 Unicode 编码存储在 byteNumbers 数组的相应位置(索引 i)。

这个过程的目的是将原始二进制数据(以字符串形式存在的字符集)转换为对应的数字表示形式。后续代码可能需要使用这些数字,例如用于创建 Uint8Array 或其他二进制数据结构。在这个具体的代码中,这些数字可能被用于创建表示文件内容的二进制数据。

Unicode 编码: 在处理一些特殊的文件格式,比如 PDF,可能会涉及到将二进制数据按照一定规则转换为 Unicode 编码。这是因为某些文件格式可能使用非常规的编码方式,需要在 JavaScript 中进行适当的转换,以便后续处理。

4)Uint8Array()

这行代码的目的是创建一个 Uint8Array 对象,该对象包含了之前收集的字节数据的数值表示。具体的意义和作用:

  1. Uint8Array 是 JavaScript 中的一种类型化数组(TypedArray),它表示一个包含 8 位无符号整数的二进制数据缓冲区。

  2. byteNumbers 是之前通过遍历 byteCharacters 字符串得到的包含每个字符 Unicode 编码的数组。

  3. new Uint8Array(byteNumbers) 创建了一个新的 Uint8Array 对象,该对象的内容是由 byteNumbers 数组提供的数值。

  4. 这样得到的 byteArray 对象实际上是一个包含了文件内容的二进制数据,其中每个元素都是一个 8 位无符号整数,对应于之前字节数据的数值表示。

这一步的目的是将之前的字符编码数组转换为类型化数组,以便后续可以更方便地进行二进制数据的处理和操作。通常,这样的数组可以用于创建诸如 Blob 对象、ArrayBuffer 等二进制数据结构。在这个具体的代码中,byteArray 可能会用于创建表示文件内容的 Blob 对象,用于文件预览等操作。

5)Blob()

这行代码的目的是创建一个 Blob 对象,用于表示二进制大对象,其中包含了之前转换的文件内容的二进制数据。意义和作用:

  1. Blob 是 JavaScript 中的一个对象,用于表示二进制大对象(Binary Large Object)。它通常用于存储二进制数据,比如文件内容。

  2. new Blob([byteArray], { type: 'application/pdf' }) 创建了一个新的 Blob 对象,其中 byteArray 是之前创建的 Uint8Array 对象,它包含了文件内容的二进制数据。

  3. 第一个参数 [byteArray] 是一个数组,表示 Blob 对象的内容。在这里,我们将 byteArray 放入数组中,作为 Blob 对象的二进制数据内容。

  4. 第二个参数 { type: 'application/pdf' } 指定了 Blob 对象的 MIME 类型。在这个具体的例子中,类型被指定为 'application/pdf',表明这是一个 PDF 文件。

  5. 注意:对于图片而言,浏览器通常可以通过文件扩展名等方式自动识别图像类型,因此在创建 Blob 对象时不强制指定类型是合理的。因为浏览器在处理图像时通常会根据文件的内容自动识别图像格式。

  6. 而对于预览 PDF 文件的情况,指定了 { type: 'application/pdf' } 作为 MIME 类型。这是因为 PDF 文件不一定包含文件扩展名等能够让浏览器自动识别的信息,因此通过指定明确的 MIME 类型可以确保正确地将二进制数据解释为 PDF 文件。

    对于其他类型的文件,你可以根据需要指定适当的 MIME 类型。例如,Word 文档通常使用 'application/msword''application/vnd.openxmlformats-officedocument.wordprocessingml.document' 等类型。指定正确的 MIME 类型有助于确保浏览器正确解释和处理文件内容。如果未指定类型,浏览器将尝试根据文件内容自动确定,但这不总是可靠的。

这一步的目的是创建一个表示文件内容的 Blob 对象,方便后续在浏览器中进行预览。通常,这个 Blob 对象可以被用于创建一个 URL,然后用于打开文件预览窗口或其他相关操作。

6)URL.createObjectURL()

这行代码的目的是使用 URL.createObjectURL() 方法创建一个包含 Blob 对象内容的 URL。具体的意义和作用:

  1. URL.createObjectURL(blob) 是一个 Web API 方法,它接受一个 Blob 对象作为参数,并返回一个表示该 Blob 对象内容的 URL

  2. blob 是之前创建的包含文件内容的 Blob 对象。

  3. URL.createObjectURL(blob)blob 对象转换为一个 URL,该 URL 可以用于在浏览器中访问 Blob 对象的内容。

  4. this.fileUrl = ... 将生成的 URL 存储在对象的 fileUrl 属性中。这个属性可能被后续代码用于在浏览器中进行文件预览。

这一步的目的是为了获得一个用于预览文件内容的 URL,通常用于将文件内容嵌入到页面中或者在新窗口中打开。

7)为什么在这个过程中会选择使用类型化数组(Uint8Array

  1. 二进制数据的表示: 在JavaScript中,通常使用字符串表示文本数据,而不是直接操作二进制数据。但在处理文件、图像等二进制数据时,直接使用字符串可能不够高效。

  2. Uint8Array: Uint8Array 是一种类型化数组,它表示一个包含 8 位无符号整数的二进制数据缓冲区。这意味着每个元素都可以存储一个字节的数据。

  3. 二进制数据的处理: 将二进制数据存储在 Uint8Array 中,相比于字符串,提供了更直接、更高效的方式来处理二进制数据。你可以方便地遍历、修改、截取等操作,而无需担心字符编码等细节。

  4. Blob 构造: Blob 构造函数通常接受一个类型化数组作为参数,因为它能更好地适应二进制数据的结构。Uint8Array 就是这样的一种类型化数组,可以直接用于创建 Blob 对象。

  5. 二进制数据的标准化: 使用 Uint8Array 作为中间步骤,有助于确保二进制数据在进行Blob构造等操作时,处于一种标准化和易处理的形式。

短而言之,Uint8Array 提供了一种更直接、更高效地处理二进制数据的方式,适合在文件、图像等场景下进行操作。在这个具体的代码中,它有助于确保二进制数据的结构和格式得到正确处理,以便后续的 Blob 构造和 URL 创建。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

添加边界值分析测试用例

1.1创建项目成功后会自动生成封装好的函数&#xff0c;在这些封装好的函数上点击右键&#xff0c;添加边界值分析测试用例&#xff0c;如下图所示。 1.2生成的用例模版是不可以直接运行的&#xff0c;需要我们分别点击它们&#xff0c;让它们自动生成相应测试用例。如下图所示&…

FindMy技术与相机结合

FindMy是苹果公司提供的设备追踪服务&#xff0c;用来帮助用户定位丢失的设备。自苹果公司开放Findmy网络之后&#xff0c;FindMy技术便与各种生活设备相结合&#xff0c;比如与相机的结合。 想象一下&#xff0c;你正在外出办事或者旅行时&#xff0c;突然意识到相机丢了&…

BEESCMS靶场小记

MIME类型的验证 image/GIF可通过 这个靶场有两个小坑&#xff1a; 1.缩略图勾选则php文件不执行或执行出错 2.要从上传文件管理位置获取图片链接&#xff08;这是原图上传位置&#xff09;&#xff1b;文件上传点中显示图片应该是通过二次复制过去的&#xff1b;被强行改成了…

H12-821_110

110.如图所示&#xff0c;R1和R2构成VRID为2的VRRP备份组&#xff0c;以下关于VRRP主备选举过程的描述&#xff0c;错误的是哪一项&#xff1f; A.同时启动的情况下&#xff0c;R1比R2更快切换至master状态 B.最终R1会发送免费ARP报文 C.两台设备完成初始化后都会先切换至Bac…

开发实践6_project

要求&#xff1a; ① 页面写入超链接&#xff0c;获取所有数据item&#xff0c;显示在另一个页面&#xff0c;1min内&#xff0c;即使数据有变化&#xff0c;页面内容不变&#xff0c;1min后点击超链接可获取最新信息&#xff1b; ② 使用middleware完成用户请求路径判断 &am…

新版K8s:v1.28拉取Harbor仓库镜像以及本地镜像(docker弃用改用containerd,纯纯踩坑)

目录 一、项目概述二、环境三、项目样式Harborkuboard运行样式 四、核心点Harbor安装config.toml文件修改(containerd)ctr、nerdctl相关命令kuboard工作负载 五、总结 一、项目概述 使用Kuboard作为k8s集群的管理平台&#xff0c;Harbor作为镜像仓库&#xff0c;拉取Harbor镜像…

使用pdfbox 为 PDF 增加水印

使用pdfbox 为 PDF增加水印https://www.jylt.cc/#/detail?activityIndex2&idbd410851b0a72dad3105f9d50787f914 引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>3.0.1</ve…

线程的使用

线程的创建方式 1、实现Runnable Runnable规定的方法是run()&#xff0c;无返回值&#xff0c;无法抛出异常 实现Callable 2、Callable规定的方法是call()&#xff0c;任务执行后有返回值&#xff0c;可以抛出异常 3、继承Thread类创建多线程 继承java.lang.Thread类&#xff0…

如何查找遥感卫星相关参数

背景介绍 做遥感卫星筛选和数据处理时&#xff0c;我们经常需要查询遥感卫星的参数&#xff0c;比如说传感器类型、分辨率、轨道参数和幅宽等。 遥感卫星参数内容 但如果只用百度&#xff0c;搜索的结果要不没有卫星参数&#xff0c;要不就是卫星相关的新闻&#xff0c;有用的…

渗透测试之如何部署和使用Supershell

环境: Supershell v2.0.0 Centos 7.6 docker v. 21 问题描述: 如何部署和使用Supershell 解决方案: 1、下载最新release源码,解压后进入项目目录 wget https://github.com/tdragon6/Supershell/releases/latest/download/Supershell.tar.gz如果在线下很慢,用浏览…

Unreal Engine(UE5)中构建离线地图服务

1. 首先需要用到3个软件&#xff0c;Unreal Engine&#xff0c;gis office 和 bigemap离线服务器 Unreal Engine下载地址:点击前往下载页面 Gis office下载地址:点击前往下载页面 Bigemap离线服务器 下载地址: 点击前往下载页面 Unreal Engine用于数字孪生项目开发&#x…

leedcode刷题笔记day1

题目大意&#xff1a; 暴力解法 两个for循环&#xff08;也是我一看到题目想到的方法&#xff09; 枚举在数组中所有的不同的两个下标的组合逐个检查它们所对应的数的和是否等于 target 复杂度分析 时间复杂度:O(n2)&#xff0c;这里 n 为数组的长度 空间复杂度:O(1)&#x…

unity SqLite读取行和列

项目文件 链接&#xff1a;https://pan.baidu.com/s/1BabHvQ-y0kX_w15r7UvIGQ 提取码&#xff1a;emsg –来自百度网盘超级会员V6的分享 using System.Collections; using System.Collections.Generic; using UnityEngine; using Mono.Data.Sqlite; using System; using Syste…

【c++】栈(satck)和队列(queue)

目录 一、stack 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue 1.queue的介绍 2.queue的使用 3.queue的模拟实现 三、priority_queue 1.priority_queue的介绍 2.priority_queue的使用 一、stack 1.stack的介绍 &#xff08;1&#xff09;stack是一种容…

HarmonyOS—声明式UI描述

ArkTS以声明方式组合和扩展组件来描述应用程序的UI&#xff0c;同时还提供了基本的属性、事件和子组件配置方法&#xff0c;帮助开发者实现应用交互逻辑。 创建组件 根据组件构造方法的不同&#xff0c;创建组件包含有参数和无参数两种方式。 说明 创建组件时不需要new运算…

排序算法(初阶)【冒泡,插入,选择排序】

文章目录 冒泡排序冒泡排序原理图解冒泡排序算法名称由来冒泡排序算法的时间复杂度最好的情况最坏的情况 冒泡排序代码冒泡排序的稳定性 选择排序选择排序的原理图解选择排序的时间复杂度选择排序的代码代码 选择排序的稳定性 插入排序插入排序原理图解插入排序的时间复杂度最好…

使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA

目前基于大模型的信息检索有两种方法&#xff0c;一种是基于微调的方法&#xff0c;一种是基于 RAG 的方法。 信息检索和知识提取是一个不断发展的领域&#xff0c;随着大型语言模型&#xff08;LLM&#xff09;和知识图的出现&#xff0c;这一领域发生了显着的变化&#xff0…

2.4 网络层01

2.4 网络层01 2.4.1 网络层概述 网络层的主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输。 异构网络内部的计算机要想实现通信是不需要实现网络互联的&#xff0c;异构网络之间要想实现通信就必须实现网络互连。 路由器工作在五层协议体系结构的网络…

HCIA的路由协议

动态路由协议/静态路由协议 静态路由协议和动态路由协议的区别&#xff1a; 静态路由协议的缺点&#xff1a; 配置繁琐 针对拓扑的变化不能够自动收敛 只适用于小型网络 静态路由协议优点&#xff1a; 占用资源少 安全 稳定 动态路由协议的优点&#xff1a; 配置简单 针对拓…

风丘科技为您提供完整的ADAS测试方案

一 方案概述 随着5G通讯与互联网的快速发展&#xff0c;智能汽车和ADAS辅助系统的研究与发展在世界范围内也在如火如荼地进行。风丘科技紧跟时代脚步&#xff0c;经多年积累沉淀&#xff0c;携手整车厂与高校共同研发打造出了一套完整且适用于国内ADAS测试的系统方案。 | ADAS…
最新文章