Vue3 实现文件预览 Word Excel pdf 图片 视频等格式 大全!!!!

先上效果图

 

 插件安装

先说 word 文件是docx-preview插件

          excel文件是用 xlsx 插件    

介绍后端返回的数据

因为在拦截器处 做了对数据的处理 最后你调接口拿到的数据是 一个对象 里面包含:

url : blob对象转换的用于访问Blob数据的临时链接。这个链接可以被用于在网页中展示二进制数据,比如显示图像或者播放音视频文件

blobs:  返回的Blob对象,代表了从网络请求中获取到的二进制数据

这上下俩部分很重要!!!!!!!!

如果返回的普通格式的话就大家直接转化

  1. const blob = new Blob([res], { type: 'application/pdf' })  //你需要的类型 转化为blob对象

  2. const url = window.URL.createObjectURL(blob)         //将对象转化为链接


也就是你后面掉接口返回的数据  

给大家打印一下 我当时在网上搜索这类资料的时候 就是在这一部分弄糊涂了 对数据格式不了解

 

 然后就到正式书写了

下载引入插件 (我这是v3 引入 vue2版本 csdn官网上搜vue预览文件 一大堆 大家自己搜一下)

//word文档注释
import { renderAsync } from 'docx-preview';
//excel注释
import * as XLSX from "xlsx";

Word预览   

不清楚result 返回内容的往上滑 这里传递的是blob对象!!

 <!-- 若是word文档格式数据号展示  我这里是加自己定义的类型判断了 fileType  大家可删除掉  --><div ref="refWord" id="fileShow" v-else-if="fileType == 'docx'" style="width: 100%;height: 100%;"></div>//js代码处const previewContainer = document.getElementById('fileShow');renderAsync(result.blob, previewContainer) //渲染

Excel预览

不清楚result 返回内容的往上滑 这里传递的是blob对象!!    中间内容是在拿到数据渲染的时候插件数据处理 最后将处理的数据当参数传递到处理样式的方法中

<!-- 若是excel格式数据展示 -->
<div  id="fileShowTwo" style="width: 100%;height: 100%;" v-else-if="fileType == 'xlsx'"><div class="tab"><el-radio-group size="small" v-model="excel.sheetNameActive" @change="getSheetNameTable"><el-radio-button v-for="(item, index) in excel.sheetNames" :key="index" :label="item"></el-radio-button></el-radio-group></div><divstyle="margin-top: 5px;border: 1px solid #a0a0a0;overflow:auto;"><div v-html="excel.SheetActiveTable" style="padding: 10px 15px"></div></div>
</div>
<div v-else-if="fileType == 'mp4'" style="width: 100%;height: 100%;"><video :src="fileAddress" controls  style="width: 100%;height: 100%;"></video>
</div>//js代码处//表格预览所需数据 定义
const data = reactive({excel: {// 数据workbook: {},// 表名称集合sheetNames: [],// 激活项sheetNameActive: "",// 当前激活表格SheetActiveTable: ""}
})
const { excel } = toRefs(data);
// 视频预览所需数据
const emptyTips = ref('暂无内容');//格式为excel时 方法中书写的内容 const reader = new FileReader(); //创建了一个FileReader对象,这个对象用于异步读取文件内容//通过readAsArrayBuffer将blob转换为ArrayBuffer对象reader.readAsArrayBuffer(result.blob) // 这里的res.data是blob文件流reader.onload = (event) => {// 读取ArrayBuffer数据变成Uint8Arrayvar data = new Uint8Array(event.target.result);// 这里的data里面的类型和后面的type类型要对应var workbook = XLSX.read(data, { type: "array" });const sheetNames = workbook.SheetNames // 工作表名称集合excel.value.workbook = workbookexcel.value.sheetNames = sheetNamesexcel.value.sheetNameActive = sheetNames[0]//方法getSheetNameTable(sheetNames[0])};//定义的方法
const getSheetNameTable = (sheetName) => { try {// 获取当前工作表的数据const worksheet = excel.value.workbook.Sheets[sheetName]// 转换为数据  1.json数据有些问题,2.如果是html那么样式需修改let htmlData = XLSX.utils.sheet_to_html(worksheet, { header: '', footer: '' })htmlData = htmlData === '' ? htmlData : htmlData.replace(/<table/, '<table class="default-table" border="1px solid #ccc" cellpadding="0" cellspacing="0"')// 第一行进行改颜色htmlData = htmlData === '' ? htmlData : htmlData.replace(/<tr/, '<tr style="background:#b4c9e8"')excel.value.SheetActiveTable = htmlData} catch (e) {// 如果工作表没有数据则到这里来处理excel.value.SheetActiveTable = '<h4 style="text-align: center">' + emptyTips.value + '</h4>'}
}

pdf 预览  

这个需要用到iframe标签  他的blob对象的type需要是"type": "application/pdf"  大家可以看一下自己的blob对象 如果是后端返回的直接是blob格式 但是type不对 那等下我下面代码有转化  如果返回的普通数据 大家自己根据上面的格式自己转化blob对象的时候自己设置一下type 

 <!-- 若是pdf数据展示 --><iframe :src="fileAddress"   type="application/pdf"  v-else-if="fileType == 'pdf'" id="pdfShow" width="100%" height="100%"></iframe>//js代码处//格式为pdf时const reader = new FileReader();reader.readAsArrayBuffer(result.blob);reader.onload = function () {fileAddress.value = URL.createObjectURL(new Blob([reader.result], { "type": "application/pdf" }))}

最后是jpg png ,mp4格式预览

  //这里就用到blob对象转化的链接了 注意区分!!
if (type == 'jpg' || type == 'png' || type == 'mp4') {fileAddress.value = result.url
}//图片类型展示<img style="width: 150px;height: 150px;" :src="fileAddress" alt="" v-if="fileType == 'jpg' || fileType == 'png'">//视频类型展示<div v-else-if="fileType == 'mp4'" style="width: 100%;height: 100%;"><video :src="fileAddress" controls  style="width: 100%;height: 100%;"></video></div>

下载文件 !!

<el-button @click="DownloadFn()"> 下载</el-button>// 文件下载
const DownloadFn = () => { let a = document.createElement('a')// 下载链接a.href = blobUploadValue.value  //这个就是那个blob链接!!// 下载文件名,如果后端没有返回,可以自己写a.download = '文件.pdf'//这里是你上传的文件名 加上他的类型 jpg,png,docx.....a.download = fileNameValue.value + '.' + fileType.valuedocument.body.appendChild(a)// 点击a标签,进行下载 a.click()// 移除元素document.body.removeChild(a)
}

最后是完整代码 

<el-dialog v-model="dialogTabsVisible" title="附件展示" class="file-show-box" @close="closeDialog()"><div class="file-body"><!-- 左侧附件列表 --><div class="file-left" ><div class="list" :class="{'list-active' : listAct == index}" v-for="(item, index) in fileList" :key="index" @click="handleClick(item,index)">{{ item.name }}</div></div><div class="file-right"><div class="downFile" v-if="fileType != 'pdf'"><el-button @click="DownloadFn()"> 下载</el-button></div><!-- 若是图片数据展示 --><img style="width: 150px;height: 150px;" :src="fileAddress" alt="" v-if="fileType == 'jpg' || fileType == 'png'"><!-- 若是txt格式数据展示 --><iframe :src="fileAddress" frameborder="0" v-else-if="fileType == 'txt'" style="width: 90%; height: 100%;"></iframe><!-- 若是pdf数据展示 --><iframe :src="fileAddress"   type="application/pdf"  v-else-if="fileType == 'pdf'" id="pdfShow" width="100%" height="100%"></iframe><!-- 若是word文档格式数据号展示 --><div ref="refWord" id="fileShow" v-else-if="fileType == 'docx'" style="width: 100%;height: 100%;"></div><!-- 若是excel格式数据展示 --><div  id="fileShowTwo" style="width: 100%;height: 100%;" v-else-if="fileType == 'xlsx'"><div class="tab"><el-radio-group size="small" v-model="excel.sheetNameActive" @change="getSheetNameTable"><el-radio-button v-for="(item, index) in excel.sheetNames" :key="index" :label="item"></el-radio-button></el-radio-group></div><divstyle="margin-top: 5px;border: 1px solid #a0a0a0;overflow:auto;"><div v-html="excel.SheetActiveTable" style="padding: 10px 15px"></div></div></div><div v-else-if="fileType == 'mp4'" style="width: 100%;height: 100%;"><video :src="fileAddress" controls  style="width: 100%;height: 100%;"></video></div><div v-else>该文件暂不支持预览,请下载查看</div></div></div></el-dialog>//js部分//表格预览所需数据
const data = reactive({excel: {// 数据workbook: {},// 表名称集合sheetNames: [],// 激活项sheetNameActive: "",// 当前激活表格SheetActiveTable: ""}
})
const { excel } = toRefs(data);
// 视频预览所需数据
const emptyTips = ref('暂无内容');
// 下载文件
// 文件地址
const fileAddress = ref('')
// 下载流数据
const blobUploadValue = ref('')//我这里的参数type是其他地方传递过来的 注意甄别
const downloadFn = (id, type) => {let params = { fileId: id }download(params).then(result => {console.log(result.url, 'resolve');console.log(result.blob, 'blob');blobUploadValue.value = result.urlif (type == 'jpg' || type == 'png' || type == 'mp4') {//格式为图片 视频时fileAddress.value = result.url} else if (type == 'docx') {//格式为word时const previewContainer = document.getElementById('fileShow');renderAsync(result.blob, previewContainer) //渲染} else if (type == 'xlsx') {//格式为excel时const reader = new FileReader();//通过readAsArrayBuffer将blob转换为ArrayBuffer对象reader.readAsArrayBuffer(result.blob) // 这里的res.data是blob文件流reader.onload = (event) => {// 读取ArrayBuffer数据变成Uint8Arrayvar data = new Uint8Array(event.target.result);// 这里的data里面的类型和后面的type类型要对应var workbook = XLSX.read(data, { type: "array" });const sheetNames = workbook.SheetNames // 工作表名称集合excel.value.workbook = workbookexcel.value.sheetNames = sheetNamesexcel.value.sheetNameActive = sheetNames[0]getSheetNameTable(sheetNames[0])};} else if (type == 'pdf') {//格式为pdf时const reader = new FileReader();reader.readAsArrayBuffer(result.blob);reader.onload = function () {fileAddress.value = URL.createObjectURL(new Blob([reader.result], { "type": "application/pdf" }))}}})
}// 文件下载
const DownloadFn = () => { let a = document.createElement('a')// 下载链接a.href = blobUploadValue.value// 下载文件名,如果后端没有返回,可以自己写a.download = '文件.pdf'a.download = fileNameValue.value + '.' + fileType.valuedocument.body.appendChild(a)// 点击a标签,进行下载 a.click()// 移除元素document.body.removeChild(a)
}const getSheetNameTable = (sheetName) => { try {// 获取当前工作表的数据const worksheet = excel.value.workbook.Sheets[sheetName]// 转换为数据  1.json数据有些问题,2.如果是html那么样式需修改let htmlData = XLSX.utils.sheet_to_html(worksheet, { header: '', footer: '' })htmlData = htmlData === '' ? htmlData : htmlData.replace(/<table/, '<table class="default-table" border="1px solid #ccc" cellpadding="0" cellspacing="0"')// 第一行进行改颜色htmlData = htmlData === '' ? htmlData : htmlData.replace(/<tr/, '<tr style="background:#b4c9e8"')excel.value.SheetActiveTable = htmlData} catch (e) {// 如果工作表没有数据则到这里来处理excel.value.SheetActiveTable = '<h4 style="text-align: center">' + emptyTips.value + '</h4>'}
}

 这里是后端返回回来一个附件名称列表 我渲染到左侧的附件列表中 然后通过选中不同的附件 右侧展示不同的文件预览 他的文件类型我也是从这里得到的 然后我通过点击不同的附件列表 执行上面的预览方法 获取到不同的blob数据 然后进行展示 

我只能给大家说一下我的逻辑 毕竟每个人代码不一样 不一定能直接复制  还是希望能帮到大家

最后贴上效果图

 

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

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

相关文章

pytorch分布式数据训练结合学习率周期及混合精度

文章目录 1、SPAWN方式2、torchrun 方式 正如标题所写&#xff0c;我们正常的普通训练都是单机单卡或单机多卡。而往往一个高精度的模型需要训练时间很长&#xff0c;所以DDP分布式数据并行和混合精度可以加速模型训练。混精可以增大batch size. 如下提供示例代码&#xff0c;经…

Spring MVC(一)【什么是Spring MVC】

重点 Spring&#xff1a;IOC 和 AOP 。 Spring MVC &#xff1a;Spring MVC 的执行流程。 SSM 框架的整合&#xff01; Spring 和 Mybatis 我们不建议使用太多注解&#xff0c;Spring MVC 建议全部使用注解开发&#xff01; 1、MVC 回顾 1.1、什么是MVC MVC是模型(Model)…

chrome历史版本下载

chrome历史版本下载 windows Google Chrome all versions on Windows linux版本 Google Chrome 64bit Linux版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒

软件架构风格总结以及场景应用

目录 前言1. 数据流风格2. 调用/返回风格3. 独立构件风格4. 解释器风格5. 仓库风格 前言 软件架构风格可以几个大类&#xff1a; 数据流风格&#xff1a;有批处理风格、管道-过滤器调用/返回风格&#xff1a;有主程序/子程序、面向对象、层次结构等独立构件风格&#xff1a;有…

藏在超级应用背后的逻辑和哲学

众所周知&#xff0c;Elon Musk 想将 Twitter 重新设计定位成一款“超级应用 - X”的野心已经不再是秘密。伴随着应用商店中 Twitter 标志性的蓝鸟 Logo 被 X 取代后&#xff0c;赛博世界充满了对这件事情各种角度的探讨与分析。 Musk 曾经无数次通过微信这一样本来推广他的“超…

Linux:命令行参数和环境变量

文章目录 命令行参数环境变量环境变量的概念常见的环境变量PATH 环境变量表本地变量和环境变量命令分类 本篇主要解决以下问题&#xff1a; 什么是命令行参数命令行参数有什么用环境变量是什么环境变量存在的意义 命令行参数 在学习C语言中&#xff0c;对于main函数当初的写…

iOS开发UITableView的使用,区别Plain模式和Grouped模式

简单赘述一下 的创建步骤 // 创建UITableView self.tableView [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; // 设置数据源和代理 self.tableView.dataSource self; self.tableView.delegate self; // 注册自定义UITableViewCe…

【数据结构】830+848真题易错题汇总(自用)

【数据结构】830848易错题汇总(10-23) 文章目录 【数据结构】830848易错题汇总(10-23)选择题填空题判断题简答题&#xff1a;应用题&#xff1a;算法填空题&#xff1a;算法设计题&#xff1a;(待补) 选择题 1、顺序栈 S 的 Pop(S, e)操作弹出元素 e&#xff0c;则下列(C )是正…

数组中指针不同加1的区别

#include <iostream> int main(){int a[5] {1,2,3,4,5};int* p (int*)(&a1);printf("%d",*(p-1)); // 这段代码会输出4 }原因&#xff1a; array和&array的值是一样的&#xff0c;但是他们代表的意义完全不一样&#xff0c;array是数组首元素的首地址…

Android中使用Glide加载圆形图像或给图片设置指定圆角

一、Glide加载圆形头像 效果 R.mipmap.head_icon是默认圆形头像 ImageView mImage findViewById(R.id.image);RequestOptions options new RequestOptions().placeholder(R.mipmap.head_icon).circleCropTransform(); Glide.with(this).load("图像Uri").apply(o…

最新Tuxera NTFS2024破解版mac读写NTFS磁盘工具

Tuxera NTFS for Mac是一款Mac系统NTFS磁盘读写软件。在系统默认状态下&#xff0c;MacOSX只能实现对NTFS的读取功能&#xff0c;Tuxera NTFS可以帮助MacOS 系统的电脑顺利实现对NTFS分区的读/写功能。Tuxera NTFS 2024完美兼容最新版本的MacOS 11 Big Sur&#xff0c;在M1芯片…

php文本转语音功能插件

当前插件集成了百度文本转语音功能,支持laravel 9版本以上. 下载方式: 1、通过composer下载:composer require yreborn/laravel-speech 2、在composer.json 新增 “yreborn/laravel-speech”: “dev-main”&#xff0c;在命令行使用composer install进行安装 1、创建config/…

Oracle数据库 ORA-28001: the password has expired解决方法

今天在用dbvisualizer登录数据库的时候&#xff0c;报了the password has expired的错误&#xff0c;于是上网查了一下原因&#xff0c;是因为数据库密码过期了&#xff0c;因为默认的是180天。 解决方法&#xff1a; 1&#xff09;用系统用户登录 #在cmd终端输入&#xff1…

基于晶体结构优化的BP神经网络(分类应用) - 附代码

基于晶体结构优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于晶体结构优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.晶体结构优化BP神经网络3.1 BP神经网络参数设置3.2 晶体结构算法应用 4.测试结果…

【单片机基础】使用51单片机制作函数信号发生器(DAC0832使用仿真)

文章目录 &#xff08;1&#xff09;DA转换&#xff08;2&#xff09;DAC0832简介&#xff08;3&#xff09;电路设计&#xff08;4&#xff09;参考例程&#xff08;5&#xff09;参考文献 &#xff08;1&#xff09;DA转换 单片机作为一个数字电路系统&#xff0c;当需要采集…

UE5 运行时生成距离场数据

1.背景 最近有在运行时加载模型的需求&#xff0c;使用DatasmithRuntimeActor可以实现&#xff0c;但是跟在编辑器里加载的模型对比起来&#xff0c;室内没有Lumen的光照效果。 图1 编辑器下加载模型的效果 图2 运行时下加载模型的效果 然后查看了距离场的数据&#xff0c;发现…

华为智选SF5,AITO问界的车怎么样

#华为智选 #赛力斯SF5 #aito问界m5 #aito问界m7 #华为汽车 华为的车&#xff0c;后杠焊两点&#xff0c;拉车的时候&#xff0c;拖车钩断了&#xff0c;后杠拉出来了&#xff0c;这质量可以吗&#xff1f;是否应该全部召回&#xff1f;M5&#xff0c;M7是不是也这样&#xff1f…

蓝桥杯(跳跃 C++)

思路&#xff1a; 1、根据题目很容易知道可以用深度搜索、广度搜索、动态规划的思想解题。 2、这里利用深度搜素&#xff0c;由题目可知&#xff0c;可以往九个方向走。 3、这里的判断边界就是走到终点。 #include<iostream> using namespace std; int max1 0; int …

增加并行度后,发现Flink窗口不会计算的问题。

文章目录 前言一、现象二、结论三、解决 前言 窗口没有关闭计算的问题&#xff0c;一直困扰了很久&#xff0c;经过多次验证&#xff0c;确定了问题的根源。 一、现象 Flink使用了window&#xff0c;同时使用了watermark &#xff0c;并且还设置了较高的并行度。生产是设置了…

chromium 54 chrome 各个版本发布功能列表(109-119)

chromium Features 109-119 From https://chromestatus.com/features chromium109 Features:12 Auto range support for font descriptors inside font-face rule Auto range support for variable fonts in ‘font-weight’, ‘font-style’ and ‘font-stretch’ descrip…