vue2 - 文件预览、下载

news2024/9/24 5:31:19

目标:显示附件文件名,多个文件则用顿号隔开,点击文件可预览或下载文件

  • 支持预览 pdf 和图片 ('JPG', 'JPEG', 'PNG')
  • doc、docx文件支持下载

原型图:

实现:

1、附件信息实现:

<!-- 附件信息 -->
      <template v-if="fileInfo.data.length">
        <div class="table-panel-header" style="margin: 20px 0 15px;">附件信息</div>
        <el-descriptions
          border
          :column="2"
        >
        <el-descriptions-item
          :label-style="{ width: '200px'}"
          v-for="(item,index) in fileInfo.data"
          :key="index"
          :label="item.name"
          >
          <div v-for="(file, index2) in item.value" :key="index2">
            <el-button type="text" size="mini" @click="checkFile(file)">
              {{file.fileName}}
            </el-button>
            <span v-if="index2 !== item.value.length - 1">、</span>
          </div>
          </el-descriptions-item>
        </el-descriptions>
      </template>

<!-- 附件信息-文件预览 -->
    <el-dialog :visible.sync="fileDialog.visible" title="附件预览"  width="1000px" append-to-body>
      <div v-loading="fileDialog.loading">
        <span v-if="!fileDialog.isShowPng">文件暂不支持预览,请下载后查看:</span>
        <el-button :loading="fileDialog.btnLoading" type="primary" size="small" @click="DownloadAttachments" style="margin-bottom: 10px">下载附件</el-button>
      </div>
      <template v-if="fileDialog.isShowPng">
        <el-image v-if="fileDialog.isPic" :src="fileDialog.url" width="100%" />
        <iframe v-else style="width:100%;height:300px" :src="fileDialog.url + '#toolbar=0'" frameborder="0" />
      </template>
    </el-dialog>
import { getEnumByTypes, downloadFastdfs, downloadBase64Fastdfs } from '@/api/common'
import { downFileFn } from '@/utils/downFiles'

checkFile(file) {
      if (!file || !file.fileUrl || !file.fileName) {
        console.error('Invalid file object:', file);
        return;
      }
      this.fileDialog.visible = true
      this.fileDialog.fileUrl = file.fileUrl
      this.fileDialog.fileName = file.fileName
      const parts = file.fileUrl.split('.');
      if (parts.length > 1) {
        const type = parts[parts.length - 1];
        this.fileDialog.isPic = ['JPG', 'JPEG', 'PNG'].includes(type.toLocaleUpperCase());
        this.fileDialog.isShowPng = !['DOC', 'DOCX'].includes(type.toLocaleUpperCase());
      } else {
        console.error('Invalid file URL:', file.fileUrl);
        return;
      }
      // const type = file.fileUrl.split('.')[1]
      // this.fileDialog.isPic = ['JPG', 'JPEG', 'PNG'].includes(type.toLocaleUpperCase())
      // this.fileDialog.isShowPng = !['DOC', 'DOCX'].includes(type.toLocaleUpperCase())
      if(this.fileDialog.isShowPng) {
        this.fileDialog.loading = true
        downloadBase64Fastdfs({url: file.fileUrl}).then(res => {
          this.fileDialog.url = 'data:image/png;base64,' + res.data.body
          if(!this.fileDialog.isPic) {
            this.fileDialog.url = this.PdfConvertFile(res.data.body)
          }
        }).finally(_ => {
          this.fileDialog.loading = false
        })
      }
    },
    // 下载附件
    DownloadAttachments() {
      this.fileDialog.btnLoading = true
      downloadFastdfs({url: this.fileDialog.fileUrl}).then(res => {
        downFileFn(res,this.fileDialog.fileName)
      }).finally(_ => {
        this.fileDialog.btnLoading = false
      })
    },

效果:

预览:

下载:

2、其他信息实现:

<!-- 其他信息 -->
      <template v-if="otherInfo.data.length > 0">
        <div class="table-panel-header" style="margin: 20px 0 15px;">其它信息</div>
        <el-descriptions
          border
          :column="2"
        >
         <el-descriptions-item
            :label-style="{ width: '200px'}"
            v-for="(item,index) in otherInfo.data"
            :key="index"
            :label="item.name "
          >{{ item.value || '-' }}</el-descriptions-item>
        </el-descriptions>
      </template>
      <div v-else class="contentBox">
        <img src="@/assets/trainFee/no_data.png" alt="" style="display: block; margin: 0 auto; padding: 40px 0 0;">
        <div style="text-align: center; padding: 20px 0; letter-spacing: 1px; font-size: 14px; font-weight: bold;">暂无其他信息</div>
      </div>

效果:

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

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

相关文章

Modbus协议基础知识

本节内容视频链接&#xff1a;【1】Modbus协议基础知识_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11G4y1W7pU?p1&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5

强化学习策略更新方法on-policy与off-policy(重要性采样,q-Learning,sarsa)

一 On-policy和Off-policy概念 策略更新方法可以分为两类&#xff1a;On-policy&#xff08;在线策略&#xff09;和Off-policy&#xff08;离线策略&#xff09;。 它们之间的主要区别在于如何使用经验&#xff08;状态、动作、奖励和下一个状态&#xff09;来更新智能体的策略…

PHP宠物爱好者交流网站-计算机毕业设计源码65481

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 注册流程 2.2.1 登录流程 2.2.3 数据删除流程 2.3 系统功能分析 2.4 系统用例分析 3 系统总体设计 3.1 系统架构设计 3.2 系统功能模块设…

跑腿代购app系统开发产品分析

跑腿代购APP的开发案例分析可以从多个维度进行&#xff0c;包括市场需求、功能设计、技术实现、用户体验以及市场推广等方面。编辑&#xff1a;qawsed2466。以下是一个基于当前行业趋势和技术发展的跑腿代购APP开发案例分析概要&#xff1a; 一、市场需求分析 1. 用户群体 忙…

01【python+playwright测试自动化】之定位方式

playwright系列文章目录 00Mac安装playwright 00Mac 安装配置Python3虚拟环境&#xff08;VirtualEnv、virtualenvwrapper扩展包&#xff09; 文章目录 playwright系列文章目录前言一、实现一个demo二、通过CSS、XPath定位三、通过文本定位四、通过角色定位五、通过标题定位六…

【最新推荐】雨林木风Windows10系统:极速下载!

今日系统之家小编给大家分享2024年最新发布的雨林木风Windows10系统下载&#xff0c;该版本系统基于微软官方最新Windows10 22H2 19045.4842 64位专业版展开离线制作&#xff0c;确保安全无毒&#xff0c;全新升级的优化方案&#xff0c;显著提升了系统的性能&#xff0c;运作变…

新能源汽车的充电基础发展规划

公共充电基础设施建设进展 公共充电基础设施作为新能源汽车发展的关键支撑&#xff0c;其建设进展在近年来显著加快。各地和企业纷纷投入资源&#xff0c;建立了大量的充电站和充电桩。这些设施不仅覆盖了城市主要区域&#xff0c;也逐渐扩展到高速公路服务区和城际连接点。除…

机器学习 第10章 降维与度量学习

目录 k近邻学习低维嵌入主成分分析&#xff08;PCA&#xff09;核化线性降维&#xff08;KPCA&#xff09;流形学习等度量映射&#xff08;Isomap&#xff09;局部线性嵌入 度量学习 k近邻学习 k 近邻&#xff08;KNN&#xff09;学习是一种常用的监督学习方法&#xff0c;其工…

太炸裂!AI绘画赚钱机会,多到你无法想象!

家人们&#xff0c;AI绘画带来的变现方式真的太多了&#xff01; 很多人会认为AI还没有落地&#xff0c;也有很多人认为这些宣扬AI红利的自媒体就是想割韭菜&#xff0c;那只能说可能认知太浅薄了。 新的事物出现&#xff0c;总会有善于捕捉信息和透过表层看清事物本质的人冲在…

格式化的硬盘能恢复数据吗?拯救数据的可能性

在信息技术高速发展的今天&#xff0c;硬盘作为计算机的核心存储部件&#xff0c;承载着大量的数据和文件。然而&#xff0c;有时因为误操作或其他原因&#xff0c;我们可能需要对硬盘进行格式化&#xff0c;这往往导致重要数据的丢失。 那么&#xff0c;格式化后的硬盘数据是否…

护网期间社区同好的一些问题总结

本文来自无问社区&#xff0c;更多网安知识分享可前往查看http://www.wwlib.cn/index.php/artread/artid/7560.html 一,SQL注入 分类&#xff1a; 从注入参数类型分&#xff1a;数字型注入、字符型注入 从注入效果分&#xff1a;报错注入、布尔注入、延时注入、联合注入、堆…

固态硬盘和机械硬盘区别?固态硬盘和机械硬盘哪个好?

在当今数据时代&#xff0c;硬盘作为电脑里的存储设备在我们的生活和工作中扮演着十分重要的角色。随着存储技术的进步&#xff0c;市场上出现了两种主流硬盘&#xff1a;固态硬盘和机械硬盘。它们各有优劣&#xff0c;那么二者究竟有什么区别&#xff1f;我们又该如何选择呢&a…

Linux驱动(六):Linux2.6驱动编写之平台设备总线

目录 前言一、平台设备总线1.是个啥&#xff1f;2.API函数 二、设备端驱动端1. 匹配机制2. 实现代码 三、设备树驱动端1.匹配机制2.代码实现 前言 本文主要介绍了一下两种驱动编写方法&#xff1a; 1.比较原始的设备端驱动端编写方法。 2.效率较高的设备树驱动端编写方法。 最…

echarts 5.3.2 折线图 tooltip设置trigger为axis无效

在使用echarts5.3.2过程中&#xff0c;发生一个不应该发生的bug&#xff0c;希望效果如下 现实中如下 代码中设置了tooltip: {trigger: ‘axis’}不生效啊。查阅文档&#xff0c;应该是这样设置的啊&#xff0c;可是为什么无效呢。改成tooltip: {trigger: ‘item’}虽能显示弹…

合宙低功耗4G模组Air724UG ——产品规格书

Air724UG 是合宙通信推出的超小封装 LTE Cat.1 bis 模块&#xff1b;采用紫光展锐的UIS8910平台&#xff0c;支持 LTE 3GPP Rel.13 技术。是4G全网通模块&#xff0c;可适应不同的运营商和产品&#xff0c;确保产品设计的最大灵活性。 模块主要特点&#xff1a; 超小封装&…

‘“node“‘ �����ڲ����ⲿ���Ҳ���ǿ����еij��� ���������ļ���

错误信息 使用vscode提交前端代码到git时&#xff0c;报下面的错&#xff0c;一直不知道啥原因&#xff0c;后来找到了个临时解决方案。。。 vscode解决方案 package.json文件中&#xff0c;去掉hooks的配置。 Idea解决方案 网上有说idea的解决方案的&#xff1a;就是提…

【Qt网络编程基础】Tcp服务器和客户端(只支持一对一)

目录 一、编写思路 1、服务器 总体思路 详细思路 1. 构造函数 (Widget::Widget) 2. 启动监听 (Widget::on_btn_start_clicked) 3. 停止监听 (Widget::on_btn_cease_clicked) 4. 发送消息 (Widget::on_btn_info_clicked) 5. 接收消息 (Widget::receive_message) 6. 处…

顶象图标点选模型识别

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 (水文一篇)使用resnet分类模型配合yolo训练的图标点选验证码,用于顶象图标点选,案例如下图:

类型参数传值问题

一、基本数据类型传参问题 public static void main(String[] args) throws Exception {Integer number null;method01(number);}private static void method01(int number){System.out.println("number " number);}Ps: 基于int基本数据类型传参的时候&#xff0c…