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.hqwc.cn/news/139575.html

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

相关文章

「我在淘天做技术」一篇文章告诉你商品团队在做哪些有意思的事?

作者:许令波(君山) 近期淘天集团秋季 2024 届校园招聘正式启动&#xff0c;预计将发放 2000 多个 offer&#xff0c;其中技术类岗位占比超过 50%。为了方便大家更真实地了解淘天技术的布局和现状&#xff0c;我们策划了「我在淘天做技术」系列&#xff0c;首次全面分享淘天技术…

智能网关IOT 2050采集应用

SIMATIC IOT2050 是西门子公司新推出的应用于企业数字化转型的智能边缘计算和云连接网关。 它将云、公司内 IT 和生产连接在一起&#xff0c;专为直接在生产环境中获取、处理和传输数据的工业 IT 解 决方案而设计。例如&#xff0c;它可用于将生产 过程与基于云的机器和生产数据…

2020年亚太杯APMCM数学建模大赛B题美国总统的经济影响分析求解全过程文档及程序

2020年亚太杯APMCM数学建模大赛 B题 美国总统的经济影响分析 原题再现&#xff1a; 美国总统选举每四年举行一次。 2020年是美国总统大选年&#xff0c;共和党候选人唐纳德特朗普和民主党对手乔拜登竞选总统。 甲乙双方候选人在金融贸易&#xff0c;经济金融治理&#xff0c;…

7款最佳的图片编辑App

无论你是设计师需要调整界面图片大小&#xff0c;还是摄影师需要剪图片&#xff0c;追求完美的比例&#xff0c;还是日常照片&#xff0c;需要P图片&#xff0c;或多或少会有剪图片的需求&#xff0c;如何选择一个简单和轻的剪图软件应用程序&#xff0c;不是一件容易的事情。本…

国际十大优质期货投资app软件最新排名(综合版)

在当今的金融市场中&#xff0c;期货投资成为了越来越多人的选择。随着科技的发展&#xff0c;许多优质的期货投资app软件也应运而生。这些软件不仅提供了便捷的投资交易工具&#xff0c;还为投资者提供了丰富的市场分析和风险管理手段。 本文将介绍国际十大优质期货投资app软…

高数笔记03:几何、物理应用

图源&#xff1a;文心一言 本文是我学习高等数学几何、物理应用的一些笔记和心得&#xff0c;希望可以与考研路上的小伙伴一起努力上岸~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图~&#x1f9e9;&#x1f9e9; 参考资料&#xff1a;《高等数学 基础篇》武…

SpringCloudSleuth异步线程支持和传递

场景 在使用Sleuth做链路跟踪时&#xff0c;默认情况下异步线程会断链&#xff0c;需要进行代码调整支持。 调整内容 方式一 使用Async实现异步线程 开启异步线程池 EnableAsync SpringBootApplication public class LizzApplication {public static void main(String[] a…

【Pytorch】深度学习之损失函数

文章目录 二分类交叉熵损失函数交叉熵损失函数L1损失函数MSE损失函数平滑L1(Smooth L1)损失函数目标泊松分布的负对数似然损失KL散度MarginRankingLoss多标签边界损失函数二分类损失函数多分类的折页损失三元组损失HingEmbeddingLoss余弦相似度CTC损失函数参考资料 学习目标&am…

深度学习——批量规范化(Batch Normalization)

深度学习——批量规范化&#xff08;Batch Normalization&#xff09; 文章目录 前言一、训练深层网络二、批量规范化层2.1. 全连接层2.2. 卷积层2.3. 预测过程中的批量规范化 三、从零实现四、使用批量规范化层的LeNet五、简洁实现六、小结总结 前言 训练深层神经网络是十分困…

【AIFEM案例教程】压力容器热固耦合分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件&#xff0c;助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题&#xff0c;软件提供高效的前后处理工具和高精度的有限元求解器&#xff0c;帮助用户快速、深入地评估结构的力学性能&#xff0c;加速产…

创意作品管理软件 Bridge 2024 mac中文版 br2024功能特色

Bridge 2024 mac旨在连接不同的Ad obe应用程序&#xff0c;帮助用户更轻松地管理和编辑他们的创意作品。 Bridge 2024 mac软件特色和功能介绍 一致的用户体验&#xff1a;Bridge 2024现在具有增强的用户界面&#xff0c;可提供与其他Creative Cloud应用程序类似的体验。用户还…

solidworks 2024新功能之-打造更加智能的工作 硕迪科技

SOLIDWORKS 2024 的新增功能 SOLIDWORKS 的每个版本都致力于改进您的工作流程&#xff0c;使您常用的工具尽可能快速高效地运作。此外&#xff0c;SOLIDWORKS 2024 可以通过量身定制的解决方案扩展您的工具集&#xff0c;并使您能够通过 Cloud Services 轻松将您的设计数据连接…