图片和PDF展示预览、并支持下载

需求

展示图片和PDF类型,并且点击图片或者PDF可以预览

第一步:遍历所有的图片和PDF列表

<div v-for="(data,index) in parerFont(item.fileInfo)" :key="index" class="data-list-item">
       <downloadCard :file-info="data" />
</div>

第二步:编写downloadcard组件

<template>
  <div class="download-card">
    <!-- 图片与PDF格式 -->
    <file-preview v-if="isImageOrPDF(fileInfo.url)" :url="fileInfo.url" :name="fileInfo.name" />
    <!-- ZIP XSLS WAP 等格式 -->
    <div v-else class="other-type">
      <div><d2-icon-svg name="transaction" class="iconrefresh" /></div>
      <div class="file-name-other">{{ fileInfo.name }}</div>
    </div>
    <div @click="donwload(fileInfo.url, fileInfo.name)">
      <d2-icon name="import" class="iconimport" />
    </div>
  </div>
</template>

<script>
import axios from 'axios';
import FilePreview from '@/components/file-preview';
export default {
  name: 'downloadCard',
  components: {
    FilePreview
  },
  props: {
    fileInfo: {
      type: Object,
      default: () => {}
    }
  },
  data() {
    return {
    };
  },
  created() {
  },
  methods: {
    justPDF(str) {
      var strRegex = '(.pdf)$'; // 用于验证后缀是否是pdf
      var reg = new RegExp(strRegex);
      if (reg.test(str.toLowerCase())) {
        // console.log('是pdf')
        return true;
      } else {
        // console.log('不是pdf')
        return false;
      }
    },
    isImageOrPDF(filename) {
      // 获取文件的扩展名
      const extension = filename.split('.').pop().toLowerCase();
      // 常见的图片和 PDF 文件扩展名
      const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'];
      const pdfExtensions = ['pdf'];
      // 检查文件扩展名是否在常见图片或 PDF 扩展名列表中
      return imageExtensions.includes(extension) || pdfExtensions.includes(extension);
    },
    donwload(fileUrl, fileName = '') {
      axios({
        method: 'get',
        url: fileUrl,
        responseType: 'blob',
      }).then((response) => {
        const link = document.createElement('a');
        const blob = new Blob([response.data], { type: response.data.type });
        const urlRef = window.URL.createObjectURL(blob);
        link.href = urlRef;
        link.download = fileName;
        link.click();
        window.URL.revokeObjectURL(urlRef);
      }).catch(err => {
        console.log(err);
      });
    }
  }
};
</script>

<style scoped lang="scss">
.download-card{
  padding: 12px;
  border-radius: 12px;
  border: 1px dashed rgba(234, 234, 234, 1);
  box-sizing: border-box;
  background: rgba(255, 255, 255, 1);
  display: flex;
  align-items: center;
  width: 235px;
  justify-content: space-between;
  color: rgba(114, 120, 128, 1);
  .file-name{
    width: 136px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    position: relative;
  }
  .file-name-other{
    width: 160px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    position: relative;
    margin-left: 5px;
  }
  .type-img{
    display: flex;
  }
  .type-pdf{
    display: flex;
  }
  .iconrefresh, .iconimport{
    width: 24px !important;
    height: 24px !important;
  }
  .other-type{
    display: flex;
    align-items: center;
    cursor: default;
  }
}
</style>

 第三步:编写FilePreview实现图片和PDF预览组件

<template>
  <div class="preview-wrap">
    <!-- PDF和图片类型点击 -->
    <div v-if="justPDF(url)" class="type-pdf" @click="previewFile(url)">
      <div><d2-icon-svg name="transaction" class="iconrefresh" /></div>
      <div class="file-name-pdf">{{ name }}</div>
    </div>
    <div v-else class="type-img" @click="previewFile(url)">
      <div>
        <img :src="url" class="type-img-preview" alt="">
      </div>
      <div class="file-name">{{ name }}</div>
      <div class="hover-pick">
        <img src="../../../public/image/merchant/Magnifying_glass.png" class="type-img-innner" alt="">
      </div>
    </div>
    <!-- PDF预览 -->
    <template v-if="pdfContainerVisible">
      <div id="pdf-container" />
      <div class="pdf-close" @click="pdfContainerVisible = false">
        <i class="el-icon-close" />
      </div>
    </template>
    <!-- 图片预览 -->
    <viewer
      v-else
      :options="{'toolbar': false, 'navbar': false, 'title': false}"
      :images="[url]"
      @inited="imagePreviewInited">
      <template slot-scope="scope">
        <img v-for="(src, index) in scope.images" :src="src" :key="index" style="display:none;">
      </template>
    </viewer>
  </div>
</template>

<script>
import Viewer from 'v-viewer/src/component.vue';
import 'viewerjs/dist/viewer.css';
// import MagnifyingGlass from '../../../public/image/merchant/Magnifying_glass.png';

import local from './local';

const SCOPE_NAME = 'siPreview';

export default {
  name: SCOPE_NAME,
  components: {
    Viewer,
  },
  inheritAttrs: false,
  props: {
    url: {
      type: String,
      default: '',
    },
    name: {
      type: String,
      default: '',
    },
    isImageBase64: false,
  },
  data() {
    return {
      pdfContainerVisible: false,
    };
  },
  created() {
    if (!this.$i18n.getLocaleMessage('en')[SCOPE_NAME]) {
      this.$i18n.mergeLocaleMessage('en', local.en);
      this.$i18n.mergeLocaleMessage('cn', local.cn);
    }
  },
  methods: {
    justPDF(str) {
      var strRegex = '(.pdf)$'; // 用于验证后缀是否是pdf
      var reg = new RegExp(strRegex);
      if (reg.test(str.toLowerCase())) {
        // console.log('是pdf')
        return true;
      } else {
        // console.log('不是pdf')
        return false;
      }
    },
    // 文件预览
    previewFile(fileUrl) {
      const fileExtension = fileUrl.split('.').pop();
      const isPdf = fileExtension.toLowerCase().startsWith('pdf');
      const isImg = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].find(suffix => fileExtension.toLowerCase().startsWith(suffix));
      if (isPdf) {
        this.pdfPreview(fileUrl);
      } else if (isImg || this.isImageBase64) {
        this.imagePreview();
      } else {
        window.open(fileUrl);
      }
    },
    // 图片预览
    imagePreview() {
      this.$viewer.show();
    },
    imagePreviewInited(viewer) {
      this.$viewer = viewer;
    },
    // PDG预览
    pdfPreview(fileUrl) {
      this.pdfContainerVisible = true;
      this.$nextTick(() => {
        let url = '';
        if (fileUrl.startsWith('http://')) {
          url = fileUrl.substring(5);
        } else if (fileUrl.startsWith('https://')) {
          url = fileUrl.substring(6);
        } else {
          url = fileUrl;
        }
        // eslint-disable-next-line no-undef
        PDFObject.embed(url, '#pdf-container', {
          width: '80%'
        });
      });
    }
  },
};
</script>

<style lang="scss" scoped>
  .preview-wrap {
    display: inline-block;
    width: 224px;
    // background: red;
    height: 30px;
    margin-right: 5px;
  }
  .preview-button {
    padding: 0;
  }
  #pdf-container {
    position: fixed;
    z-index: 10000;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    background-color: rgba(0, 0, 0, 0.6);
  }
  .pdf-close {
    position: fixed;
    z-index: 10001;
    right: 0;
    top: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 60px;
    height: 60px;
    font-size: 40px;
    color: #fff;
    background-color: rgba(0, 0, 0, 0.4);
    cursor: pointer;
  }
  .file-name{
    width: 136px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    position: relative;
    margin-left: 5px;
  }
  .file-name-pdf{
    width: 156px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    position: relative;
    margin-left: 5px;
  }
  .hover-pick{
    position: absolute;
    top: 0;
    background: #000;
    margin-top: -6px;
    border-radius: 8px;
    width: 42px;
    height: 42px;
    border: none;
    display: flex;
    justify-content: center;
    align-items: center;
    overflow: hidden;
    opacity: 0.5;
    visibility: hidden;
  }
  .type-img{
    display: flex;
    height: 30px;
    align-items: center;
    position: relative;
    .type-img-preview{
      height: 40px;
      width:40px;
      object-fit: cover;
      margin-right: 5px;
      margin-top: 3px;
      border-radius: 8px;
      border: 1px solid #EAEAEA;
    }
    .type-img-innner{
      height: 15px;
      width:15px;
      z-index: 2;
    }
    &:hover{
      .hover-pick{
        visibility:visible;
      }
    }
  }
  .type-pdf{
    display: flex;
    height: 30px;
    align-items: center;
  }
  .iconrefresh{
    width: 24px !important;
    height: 24px !important;
  }
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT 信号和槽 多对一关联示例,多个信号,一个槽函数响应,多个信号源如何绑定一个槽函数

三个顾客 Anderson、Bruce、Castiel 都要订饭&#xff0c;分别对应三个按钮&#xff0c;点击一个按钮&#xff0c;就会弹出给该顾客送饭的消息。注意这个例子只使用一个槽函数&#xff0c;而三个顾客名称是不一样的&#xff0c;弹窗时显示的消息不一样&#xff0c;这需要一些 技…

EV24CXXA EEPROM 选型

如何选择一个靠谱的EEPROM? EV24C128A EV24C256A EV24C512A 是用得最多的

在哪里可以制作微信点餐功能呢

在繁忙的都市生活中&#xff0c;餐饮行业作为与人们日常生活息息相关的行业&#xff0c;其服务质量和便捷性一直备受关注。随着科技的不断发展&#xff0c;微信点餐功能以其便捷、高效的特点&#xff0c;逐渐成为了餐饮行业的新宠。今天&#xff0c;就让我们一起探讨微信点餐的…

基于SSM的“本科生毕业设计选题系统”的设计与实现(源码+数据库+文档)

基于SSM的“本科生毕业设计选题系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 本科生毕业设计选题系统功能结构图 系统首页界面 课题信…

「漏洞复现」用友NC pagesServlet SQL注入漏洞(XVE-2024-13067)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

Keil编译bin格式固件方法

打开Option选项卡&#xff0c;选择User&#xff0c;在After Build/Rebuild下面增加以下命令&#xff1a; fromelf.exe --bin -o "L.bin" "#L"

【人工智能】第六部分:ChatGPT的进一步发展和研究方向

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

【管理咨询宝藏124】通过BLM打通前端业务与财务的双轨制设计方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏124】通过BLM打通前端业务与财务的双轨制设计方案 【格式】PDF版本 【关键词】BLM、组织架构设计、流程优化 【核心观点】 - 运用“拉通业务财务…

第54期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

图解PHP MySQL:服务器端Web开发入门

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

微服务学习Day9-分布式事务Seata

文章目录 分布式事务seata引入理论基础CAP定理BASE理论 初识Seata动手实践XA模式AT模式TCC模式SAGA模式 高可用 分布式事务seata 引入 理论基础 CAP定理 BASE理论 初识Seata 动手实践 XA模式 AT模式 TCC模式 Service Slf4j public class AccountTCCServiceImpl implements A…

AI论文:如何利用AI工具撰写毕业论文?

写作这件事一直让我们从小学时期就开始头痛&#xff0c;初高中时期800字的作文让我们焦头烂额&#xff0c;一篇作文里用尽了口水话&#xff0c;拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业&#xff0c;结果毕业前的最后一道坎拦住我们的是毕业论文&#xff0c;这玩意不…

嵌入式C语言--Pragma Section与Map文件

嵌入式C语言–Pragma Section与Map文件 嵌入式C语言--Pragma Section与Map文件 嵌入式C语言--Pragma Section与Map文件一. Pragma修饰符二. Map文件1&#xff09;什么是map文件2&#xff09;map文件的构成3&#xff09;常用的段映射地址4&#xff09;map文件生成 三. Section修…

【安装笔记-20240529-Windows-Wireshark 网络协议分析工具】

安装笔记-系列文章目录 安装笔记-20240529-Windows-Wireshark 网络协议分析工具 文章目录 安装笔记-系列文章目录安装笔记-20240529-Windows-Wireshark 网络协议分析工具 前言一、软件介绍名称&#xff1a;Wireshark主页官方介绍 二、安装步骤测试版本&#xff1a;Wireshark-4…

halcon3d算子之get_circle_pose详解

get_circle_pose -从圆的2D投影角度确定圆的3D姿态。 Description 图像中的每个椭圆都可以解释为一个圆在图像中的透视投影。事实上,对于给定半径的圆,在3D中存在两个不同方向的圆,它们会产生相同的投影。get_circle_pose确定这两个圆的3D位置和方向。首先,每个轮廓由一个…

【优选算法】BFS解决FloodFill算法

一、经验总结 什么是FloodFill算法&#xff1f; FloodFill算法是一种用于填充连通区域的算法&#xff0c;通常用于图像处理和计算机图形学中。它从给定的起始点开始&#xff0c;向周围相邻的像素进行扩散填充&#xff0c;直到遇到边界或者其他指定条件停止。 FloodFill算法还…

H5即时通讯群聊源码无限建群创群/H5聊天系统聊天网站源码/H5语音聊天系统

源码介绍 支持自助建群 管理群 修改群资料支持自动登录 登陆成功可自助修改资料后台可查看群组聊天消息记录支持表情 动态表情 图片发布支持消息语音提醒

6月4(信息差)

&#x1f30d;AI预测极端天气提速5000倍&#xff01;微软发布Aurora&#xff0c;借AI之眼预测全球风暴 &#x1f384;理解老司机&#xff0c;超越老司机&#xff01;LeapAD&#xff1a;具身智能加持下的双过程自驾系统&#xff08;上海AI Lab等&#xff09; 论文题目&#xf…

Java_List集合

特点、特有方法 ArrayList : 有序、可重复、有索引。 LinkedList&#xff1a;有序、可重复、有索引。 底层实现不同&#xff01;适合场景不同&#xff01; List 集合的特有方法 List 集合因为支持索引&#xff0c;所以多了很多索引相关的方法&#xff0c;当然&#xff0c;C…

Java多线程核心工具类

1.Thread类&#xff1a;代表一个线程。你可以通过继承Thread类或实现Runnable接口来创建线程。 2.Executor框架&#xff1a;java.util.concurrent.Executors和java.util.concurrent.Executor接口提供了一种创建和管理线程池的方法&#xff0c;可以减少在创建和销毁线程上的开销…