当前位置: 首页 > news >正文

vue3 封装图片上传预览组件支持docx、excel、pdf、图片、txt格式

在这里插入图片描述
主要是使用vue-office来实现docx和excel、pdf插件来实现预览

插件下载插件

npm i @vue-office/docx
npm i @vue-office/excel
npm i @vue-office/pdf
<script setup lang="ts">
//引入VueOfficeDocx组件
import VueOfficeDocx from '@vue-office/docx'
//引入相关样式
import '@vue-office/docx/lib/index.css'
//引入VueOfficeExcel组件
import VueOfficeExcel from '@vue-office/excel'
//引入相关样式
import '@vue-office/excel/lib/index.css'
//引入VueOfficePdf组件
import VueOfficePdf from '@vue-office/pdf'
import * as FileApi from '@/api/system/file'
const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化
const dialogVisible = ref(false) // 弹窗的是否展示
const formLoading = ref(false)
const src = ref('')
const docx = ref('')
const excel = ref('')
const pdf = ref('')
const txt = ref('')
const fileObj = ref<{ fileFormat: string; fileName: string }>({fileFormat: '',fileName: ''
})
let fileInfo
let fileUrl
const renderedHandler = () => {formLoading.value = false
}
const errorHandler = () => {formLoading.value = false
}
const open = async (data: any, url: string) => {src.value = ''docx.value = ''excel.value = ''pdf.value = ''txt.value = ''fileInfo = datadialogVisible.value = trueformLoading.value = truefileObj.value = await FileApi.getuploadInfo(url)fileUrl = await FileApi.getDownloadUrl(url)if (fileUrl) {try {if (fileObj.value.fileFormat === 'jpeg' ||fileObj.value.fileFormat === 'jpg' ||fileObj.value.fileFormat === 'png') {src.value = fileUrlformLoading.value = false} else {if (fileObj.value.fileFormat === 'xlsx' || fileObj.value.fileFormat === 'xls') {excel.value = fileUrl} else if (fileObj.value.fileFormat === 'docx') {docx.value = fileUrl} else if (fileObj.value.fileFormat === 'pdf') {pdf.value = fileUrl} else if (fileObj.value.fileFormat === 'txt') {try {const response = await fetch(fileUrl)txt.value = await response.text()formLoading.value = false} catch (e) {console.log(e)formLoading.value = false}} else {formLoading.value = false}console.log('fileObj.value.fileFormat', fileObj.value.fileFormat)}} finally {// formLoading.value = false}}
}
const close = () => {dialogVisible.value = false
}
const handleDownload = async () => {if (!fileUrl) {return}const response = await fetch(fileUrl)if (!response.ok) {message.success(t('common.downloadFail'))}const blob = await response.blob()const url = URL.createObjectURL(blob)const a = document.createElement('a')a.href = urla.download = fileInfo.fileName || fileObj.value.fileName + '.' + fileObj.value.fileFormata.click()
}
defineExpose({open
})
</script><template><Dialog v-model="dialogVisible" @close="close" width="900px" :destroy-on-close="true"><div class="preview-content" v-loading="formLoading"><img:src="src"alt=""style="width: 100%"v-if="fileObj.fileFormat === 'jpeg' ||fileObj.fileFormat === 'jpg' ||fileObj.fileFormat === 'png'"/><template v-else><vue-office-docx:src="docx"v-if="docx"style="width: 100%; height: 100%"@rendered="renderedHandler"@error="errorHandler"/><vue-office-excel:src="excel"v-if="excel"style="width: 100%; height: 100%"@rendered="renderedHandler"@error="errorHandler"/><vue-office-pdf:src="pdf"v-if="pdf"style="width: 100%; height: 100%"@rendered="renderedHandler"@error="errorHandler"/><div v-if="txt">{{ txt }}</div><span v-if="!docx && !excel && !pdf && !txt">文件类型暂不支持预览</span></template></div><template #icon><Icon class="is-hover mr-10px cursor-pointer" icon="ep:download" @click="handleDownload" /></template></Dialog>
</template><style scoped lang="scss">
.preview-content {position: relative;width: 100%;height: 600px;overflow: hidden;
}
</style>
http://www.dtcms.com/a/490250.html

相关文章:

  • (3)Bug篇
  • Monkey测试Bug排查全攻略
  • 做的网站如何发布会网站建设要求 优帮云
  • 海外建站平台开发个网站开票名称是什么意思
  • 【具身智能】MolmoAct深度解析:在空间中推理的开放式机器人动作模型
  • Linux:库制作与原理
  • SpringBoot集成测试
  • PDF Protector for mac PDF文档加密解密工具
  • 任务型与聊天型语音机器人有什么区别
  • 【具身智能】Gemini Robotics 1.5 深度解析:当机器人学会“思考”与“技能迁移”
  • 【机器人】激光雷达(LiDAR)核心原理:定位、测距与抗干扰
  • 机器人动作捕捉:光学 / 惯性 / 无标记点技术对比与工业 / RoboMaster / 高校场景适配
  • 有网站后台模板如何做数据库网站建设的方式有哪些内容
  • 在 Linux 平台上安装 64 位 JDK
  • Spring Boot配置属性:类型安全的最佳实践
  • prometheus暴露指标
  • RunnableParallel 操纵输入和输出
  • [双指针] 1. 力扣283.移动零
  • 【博客规划】关于我未来的研究方向……
  • python 列表浅拷贝 深拷贝
  • 网站如何做后台留言淘宝客网站一般用什么做的
  • 使用snmpsim与docker批量生成snmpd模拟服务
  • 燕之屋(1497.HK)燕窝肽260万单场售罄,科技重塑传统
  • 【动态规划】数位DP的原理、模板(封装类)
  • 神经网络中的批归一化(BatchNorm)
  • 最新版本组件的docker下载-nacos-Rabbitmq-redis
  • 互素最多:任意五个整数互素的巧妙构造
  • 博客网站大全上海专业网站建设价格
  • Apache换行解析 文件上传漏洞复现:原理详解+环境搭建+渗透实践(CVE-2017-15715 vulhub)
  • 自动伸缩:K8s Cluster Autoscaler,节点池配置技巧?