Vue封装文件上传组件(支持图片、PDF、Excel、word预览下载)

一、准备工作

安装预览依赖包:exceljs、mammoth、vue-pdf

二、封装组件

文件上传组件

fileUploadPro.vue。默认预览、下载是true,可通过isPreView、isDownLoad控制

<template><div style="display: flex"><el-uploadmultipleaction=""ref="uploadF":show-file-list="false":file-list="fileList":http-request="fileUpLoad"><el-button v-if="!readOnly" size="mini" type="primary">点击上传</el-button></el-upload><div style="flex-grow: 1;flex-wrap: wrap"><el-tag@close="removeFile(index)"v-for="(tag, index) in fileList":key="tag.fileId":closable="true"type="info"><div style="float: left">{{tag.name}}</div><div v-if="isPreView" class="iconStyle" @click="preView(tag)"><i  class="el-icon-view"></i></div><div v-if="isDownLoad" class="iconStyle" @click="downLoad(tag)"><i  class="el-icon-download"></i></div></el-tag></div></div>
</template>
<script>export default {name: "fileUploadPro",props: {fileList: {type: Array,default: []},isPreView: {type: Boolean,default: true},isDownLoad: {type: Boolean,default: true},readOnly:{type: Boolean,default: false}},data() {return {}},methods:{fileUpLoad(e) {let file = e.filelet formData = new FormData();formData.append("file", file); // 'file' 可变 相当于 input 表单的name 属性formData.append("name", file.name);formData.append("type", file.type);formData.append("size", file.size);formData.append("lastModifiedDate", file.lastModifiedDate);this.$http({method: 'post',url: "/base/ctBaseFile/saveFile50",data: formData}).then((response) => {if (response.data.code === 200) {this.$message.success('上传成功')this.fileList.push({fileId: response.data.data.ctBaseFile.id,name: file.name})}})},removeFile(index) {this.fileList.splice(index, 1)},preView(file) {let fileUrl = '';let fileType = '';if (file) {fileUrl = this.$fileUrl + '/common/getFileRes/' + file.fileIdconst addTypeArray = file.name.split(".");const addType = addTypeArray[addTypeArray.length - 1];if (addType === "pdf") {fileType = 'pdf'}else if(addType === 'xls' || addType === 'xlsx'){fileType = 'excel'}else if (addType === "doc" || addType === "docx") {fileType = 'word'} else if (["png", "jpg", "jpeg"].includes(addType)) {fileType = 'image'} else {fileType = addType}}this.$emit("preView",fileType,fileUrl);//that.showModal = true},downLoad(file){let a = document.createElement("a");//创建a标签a.setAttribute("href", this.$fileUrl + '/common/getFileRes/' + file.fileId);//设置文件下载地址a.setAttribute('target', '_blank');//在当前页面创建下载document.body.appendChild(a);//添加到bodya.click();//触发事件document.body.removeChild(a);//移除标签},}}
</script>
<style scope>.iconStyle{float: left;width: 16px;height: 16px;line-height: 16px;text-align: center;position: relative;top:7px;margin-left: 6px;border-radius: 50%;cursor: pointer;}.iconStyle:hover{background-color: #909399;color: #fff;}
</style>

预览组件

preViewDialog.vue

<template><div><!-- Modal --><el-dialog:title="'预览' + fileType":visible.sync="showModal"width="70%"top="5vh":before-close="handleClose":close-on-click-modal="false"><!-- Conditional rendering based on fileType --><div v-if="fileType === 'image'" style="text-align:center"><img v-loading="loading" style="height: 400px" :src="fileUrl" alt="预览图片"></div><div v-else-if="fileType === 'excel'"><el-table v-loading="loading" size="mini" :data="excelData" height="400" width="100%" :show-header="false"><el-table-column width="150" v-for="(cell, key) in excelData[0]" :key="key" :prop="key" :label="key"></el-table-column></el-table></div><div v-else-if="fileType === 'pdf'"><!-- Render PDF preview here --><VuePdf v-loading="loading" :src="pdfUrl"></VuePdf></div><div v-else-if="fileType === 'word'"><!-- Render Word preview here --><div v-loading="loading" v-html="wordContent"></div></div><div v-else><p>不支持的文件类型或未提供URL。</p></div><!-- Close Button --><span slot="footer" class="dialog-footer"><el-button type="primary" @click="downLoad(fileUrl)">下 载</el-button><el-button type="info" @click="closeModal">关 闭</el-button></span></el-dialog></div>
</template><script>import ExcelJS from 'exceljs';import mammoth from 'mammoth';import VuePdf from 'vue-pdf';export default {props: {fileType: {type: String,required: true,},fileUrl: {type: String,required: true}},components: {VuePdf,},data() {return {pdfUrl:'',loading: true,excelContent: '',wordContent: '',showModal: false,excelData: [],};},mounted() {this.showModal = truethis.loadFile();},methods: {async loadFile() {switch (this.fileType) {case 'excel':await this.loadExcel();break;case 'word':await this.loadWord();break;case 'pdf':// 加载 PDF 的逻辑await this.loadPdf();break;default:this.loading = false;break;}},closeModal() {this.loading = true;this.$emit('close-modal');},async loadExcel() {try {const response = await fetch(this.fileUrl);if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}const arrayBuffer = await response.arrayBuffer();const workbook = new ExcelJS.Workbook();await workbook.xlsx.load(arrayBuffer);const worksheet = workbook.worksheets[0]; // Assuming you want the first worksheetif (worksheet) {let data = [];worksheet.eachRow((row, rowIndex) => {let rowData = {};row.eachCell((cell, colIndex) => {rowData[`col${colIndex}`] = cell.value;});data.push(rowData);});this.excelData = data;} else {this.excelData = [];}} catch (error) {console.error('Error loading Excel:', error);this.excelData = [];} finally {this.loading = false;}},async loadWord() {try {const response = await fetch(this.fileUrl);const arrayBuffer = await response.arrayBuffer();const result = await mammoth.extractRawText({ arrayBuffer });this.wordContent = result.value;} catch (error) {this.wordContent = '加载Word文件失败。';} finally {this.loading = false;}},async loadPdf() {try {this.pdfUrl = VuePdf.createLoadingTask({url:this.fileUrl,cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.6.347/cmaps/',cMapPacked: true})const response = await fetch(this.pdfUrl);if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}} catch (error) {console.error('Error fetching data:', error);}finally {this.loading = false}},handleClose() {this.closeModal()},downLoad(file){let a = document.createElement("a");//创建a标签a.setAttribute("href", file);//设置文件下载地址a.setAttribute('target', '_blank');//在当前页面创建下载document.body.appendChild(a);//添加到bodya.click();//触发事件document.body.removeChild(a);//移除标签},},};
</script><style scoped>
</style>

三、组件调用

<template><div><fileUploadPro:file-list.sync="fileList":isPreView="true":isDownLoad="false"@preView="preView"/><previewDialogv-if="showModal":file-type="fileType":file-url="fileUrl"@close-modal="showModal = false"/></div>
</template>
<script>import previewDialog from '../components/previewDialog';import fileUploadPro from "../components/fileUploadPro";export default {name: "parentXXX",components:{previewDialog,fileUploadPro},data() {return{fileList:[],fileType: '',fileUrl:'',showModal: false,}},methods:{preView(type,url){this.fileUrl = url;this.fileType = type;this.showModal = true},}}
</script>

四、效果

 

 

 

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

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

相关文章

使用百度语音技术实现文字转语音

使用百度语音技术实现文字转语音 SpringBootVue前后端分离项目 调用api接口需要使用AK和SK生成AccessToken,生成getAccessToken的接口有跨域限制,所以统一的由后端处理了 部分参数在控制台->语音技术->在线调试里面能找到 Controller RestController RequestMapping(&q…

【Spring Cloud】掌握Gateway核心技术,实现高效路由与转发

目录 前言示例创建一个服务提供者创建网关 创建common子项目 前言 Spring Cloud Gateway 是一个基于 Spring Boot 的非阻塞 API 网关服务&#xff0c;它提供了动态路由、请求断言、过滤器等功能。 以下是关于 Spring Cloud Gateway 的示例&#xff1a; 示例 创建一个服务提…

C#实现数据采集系统-实现功能介绍

系统介绍 我们这里主要使用C#( .Net 6)来实现一个数据采集系统&#xff0c;从0到1搭建数据采集系统&#xff0c;从系统分析&#xff0c;功能拆解&#xff0c;到一一实现 数据采集 数据采集是企业信息化和数字化转型过程中的关键环节&#xff0c;它涉及到从生产设备、传感器…

近段时间led灯性价比最高有哪几款?五款led灯性价比最高推荐

近段时间led灯性价比最高有哪几款&#xff1f;作为学生&#xff0c;在学校学习的时候会接触到电子产品&#xff0c;在夜晚回到家&#xff0c;还得接着继续读写。长时间的用眼过度&#xff0c;会导致视力下降&#xff0c;严重的话还会出现眼部疾病。所以&#xff0c;需要一个护眼…

内部函数和外部函数(例子为C语言)

​​​​ 怎么来的&#xff1f; 函数本质上是全局的&#xff0c;因为定义一个函数的目的就是这个函数与其他函数之间相互调用&#xff0c;如果不声明的话&#xff0c;一个函数既可以被本文件中的其他函数调用&#xff0c;也可以被其他文件中的函数调用。但是可以指定某些函数…

第十课:telnet(远程登入)

如何远程管理网络设备&#xff1f; 只要保证PC和路由器的ip是互通的&#xff0c;那么PC就可以远程管理路由器&#xff08;用telnet技术管理&#xff09;。 我们搭建一个下面这样的简单的拓扑图进行介绍 首先我们点击云&#xff0c;把云打开&#xff0c;点击增加 我们绑定vmn…

Streaming Video Recorder 6 视频录制 视频格式转换

Streaming Video Recorder 6 是一款功能强大的录屏和视频下载软件。它具有以下特点和功能&#xff1a; 录屏功能&#xff1a;可以录制电脑屏幕上的各种内容&#xff0c;例如操作过程、在线课程、游戏等。 视频嗅探与下载&#xff1a;能够通过粘贴链接地址&#xff0c;自动检测并…

FGF18:骨关节炎治疗靶标

成纤维细胞生长因子18&#xff08;FGF18&#xff09;属于FGF8亚家族成员&#xff0c;在细胞增殖、细胞分化和细胞迁移的调节中起重要作用&#xff0c;是正常骨化和骨骼发育所需&#xff0c;同时刺激肝脏和肠道增殖。 &#xff08;数据来源AlphaFold&#xff09; FGF18由207个氨…

Ubuntu安装virtualbox(win10)

virtualbox下载安装 1、下载virtualbox 下载路径&#xff1a;Linux_Downloads – Oracle VM VirtualBox 根据自己的Ubuntu版本选择对应的安装包下载 2、安装virtualbox 到下载路径&#xff08;一般为~/Download&#xff09;打开终端输入命令 sudo dpkg -i xxx.deb 继续执…

前瞻断言与后瞻断言:JavaScript 正则表达式的秘密武器

JavaScript 中的前瞻断言&#xff08;lookahead&#xff09;和后瞻断言&#xff08;lookbehind&#xff09;相信用过的小伙伴就知道它的威力了&#xff0c;在一些特定的需求场景下&#xff0c;可以做到四两拨千斤的作用&#xff0c;今天让我们来盘点一下在 JavaScript 正则表达…

【spring boot】初学者项目快速练手

一小时带你从0到1实现一个SpringBoot项目开发_哔哩哔哩_bilibili 一、基础知识 1.注解 二、简介 三、项目结构 1.API/Controller层 业务控制层&#xff0c;控制业务层Service&#xff0c;并把数据返回给移动端和前端&#xff0c;直接转发Service的业务处理结果&#xff0c;…

Lora模型训练的参数-学习笔记

任何一个lora都会有三重属性&#xff0c;易调用性、泛化性和还原性&#xff0c;任何一个lora只能完美满足其中的两项&#xff1b; 易调用性&#xff1a;在已调用lora后&#xff0c;还需要多少提示词才能让该lora完全生效&#xff1b; 泛化性&#xff1a;能不能还原lora训练素…

新电脑怎么装系统?一文带你轻松搞定

对于刚刚购置的新电脑&#xff0c;安装操作系统是必不可少的一步。一个高效、稳定的操作系统能让您的新电脑发挥出最佳性能。本文将介绍新电脑怎么装系统的3种方法&#xff0c;每种方法都提供了详细的步骤说明&#xff0c;帮助您顺利完成系统安装。 方法1&#xff1a;通过网络安…

Java中锁的全面详解(深刻理解各种锁)

一.Monitor 1. Java对象头 以32位虚拟机位例 对于普通对象,其对象头的存储结构为 总长为64位,也就是8个字节, 存在两个部分 Kclass Word: 其实也就是表示我们这个对象属于什么类型,也就是哪个类的对象.而对于Mark Word.查看一下它的结构存储 64位虚拟机中 而对于数组对象,我…

基于python旅游景点满意度分析设计与实现

1.1研究背景与意义 1.1.1研究背景 随着旅游业的快速发展&#xff0c;满意度分析成为评估旅游景点质量和提升游客体验的重要手段。海口市作为中国的旅游城市之一&#xff0c;其旅游景点吸引了大量游客。然而&#xff0c;如何科学评估和提升海口市旅游景点的满意度&#xff0c;…

百度网盘Android一二面凉经(2024)

百度网盘Android一二面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《百度网盘Android一二面凉经(2024)》。 面试职位: 网盘主端研发组_Android高级研…

芯课堂 | SWM34S系列驱动TFT屏走线布局设计参考

​在TFT屏驱电路设计中&#xff0c;好的PCB板布局走线可以让调试更轻松&#xff0c;让EMC测试更容易通过&#xff0c;关于34S的PCB板设计应注意以下几点&#xff1a; 关于布局 在布局中需要尽量靠近MCU的元器件有&#xff1a;晶振电路所有元器件、复位电路RC、CAP滤波电容以及…

【AI大模型Agent探索】Qwen-Agent:基于Qwen的LLM应用开发框架

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

实战打靶集锦-31-monitoring

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 ssh服务4.2 smtp服务4.3 http/https服务 5. 系统提权5.1 枚举系统信息5.2 枚举passwd文件5.3 枚举定时任务5.4 linpeas提权 6. 获取flag 靶机地址&#xff1a;https://download.vulnhub.com/monitoring/Monitoring.o…

Chapter12 屏幕后处理效果——Shader入门精要学习笔记

Chapter12 屏幕后处理效果 一、屏幕后处理概述以及基本脚本系统1.OnRenderImage 函数 —— 获取屏幕图像2.Graphics.Blit 函数 —— 使用特定的Shader处理3.在Unity中实现屏幕后处理的基本流程4.屏幕后处理基类 二、调整亮度、饱和度和对比度1.BrightnessSaturationAndContrast…