vue3+ts 实现文件在线预览

news2024/9/22 21:34:14

一、背景

企业微信自建项目中要求PC端也能进行文件预览,但是企业微信提供的接口只能在移动端使用,通过查阅资料修改成贴合项目的方法。参考:https://blog.csdn.net/w_t_y_y/article/details/115767747
kkFileView官方文档

二、preview-file组件

1.三种方式:
①、Office Web 查看器 http://view.officeapps.live.com/op/view.aspx?src=encodeuricomponent(url)
②、XDOC文档预览云服务 只能免费使用几天,后续需要付费400/年/IP
https://view.xdocin.com/view?src=encodeURIComponent(url)
③、kkFileView http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url))

2.在components文件中,创建preview-file.vue文件,代码如下:

<template>
  <div>
    <!--图片-->
    <!--d-flex f-jc-c:display:flex; justify-content: center;-->
    <div class="d-flex f-jc-c" v-if="fileMessage.imgShow">
      <img :src="fileMessage.downloadUrl" />
    </div>

    <!--doc,excel-->
    <div v-else-if="fileMessage.docShow || fileMessage.excelShow">

       <!--Office Web 查看器 http://view.officeapps.live.com/op/view.aspx?src= -->
      <!-- XDOC文档预览云服务  只能免费使用几天,后续需要付费 https://view.xdocin.com/view?src=encodeURIComponent(fileMessage.downloadUrl)  -->
      <!-- kkFileView  http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url))  -->
      
      <iframe class="child" frameborder="0"
        :src="'https://view.xdocin.com/view?src=' + encodeURIComponent(fileMessage.downloadUrl)"
        :style="{ width: fileStyle.width, height: fileStyle.height }">
      </iframe>
    </div>

    <!--音频-->
    <div v-else-if="fileMessage.audioShow">
      <!-- loop="loop"  循环播放 -->
      <audio id="myaudio" :src="fileMessage.downloadUrl" controls="controls" preload="preload">
        不支持audio标签
      </audio>
    </div>

    <!--视频-->
    <div class="d-flex f-jc-c" v-else-if="fileMessage.videoShow">
      <video preload="auto" align="center" controls="true">
        <source :src="fileMessage.downloadUrl" type="video/mp4" />
      </video>
    </div>

    <!--其他不能预览的-->
    <div v-else-if="fileMessage.otherShow"></div>

  </div>
</template>

<script lang="ts" setup>

import Video from 'video.js';

import 'video.js/dist/video-js.css';

interface Props {

  file: any

}

interface Emits {

  (event: 'downLoadFile', id: string | number): void
}

interface FileMessage {

  fileId: string | number,

  fileName: string,

  downloadUrl: string,

  imgShow: boolean,

  docShow: boolean,

  excelShow: boolean,

  audioShow: boolean,

  videoShow: boolean,

  //其他不能预览的
  otherShow: boolean,

}

interface FileStyle {

  height: string,

  width: string
}

const $props = defineProps<Props>();

const $emits = defineEmits<Emits>();

const file = computed(() => $props.file);

// 文件信息
const fileMessage = reactive<FileMessage>({

  fileId: '',

  fileName: '',

  downloadUrl: '',

  imgShow: false,

  docShow: false,

  excelShow: false,

  audioShow: false,

  videoShow: false,

  //其他不能预览的
  otherShow: false,
})

const fileStyle = reactive<FileStyle>({

  height: window.innerHeight + 'px',

  width: '100%'

})

// 判断文件类型
const judgeFileType = () => {

  fileMessage.fileName = file.value.fileName;

  fileMessage.downloadUrl = file.value.downloadUrl;

  fileMessage.fileId = file.value.id;

  console.log(fileMessage.downloadUrl, 'fileMessage');

 if (

    fileMessage.fileName.endsWith('png') ||

    fileMessage.fileName.endsWith('jpg') ||

    fileMessage.fileName.endsWith('jpeg') ||

    fileMessage.fileName.endsWith('gif')

  ) {
    //图片
    fileMessage.imgShow = true;

  } else if (

    fileMessage.fileName.endsWith('docx') ||

    fileMessage.fileName.endsWith('doc') ||

    fileMessage.fileName.endsWith('pdf') ||

    fileMessage.fileName.endsWith('pptx') ||

    fileMessage.fileName.endsWith('ppt') ||

    fileMessage.fileName.endsWith('txt')

  ) {

    //doc
    fileMessage.docShow = true;

  } else if (fileMessage.fileName.endsWith('xlsx') || fileMessage.fileName.endsWith('xls')) {

    //excel
    fileMessage.excelShow = true;

  }
  else if (fileMessage.fileName.endsWith('mp3')) {

    fileMessage.audioShow = true;
  }
  else if (fileMessage.fileName.endsWith('mp4')) {

    fileMessage.videoShow = true;

  } else {

    // fileMessage.otherShow = true;
    $emits('downLoadFile', fileMessage.fileId);

  }

}

onMounted(async () => {

  await judgeFileType();

})

</script>

<style scoped lang="scss">
img {
  width: 50%;
}

audio {
  width: 100%;
}

video {
  width: 30%;
}

.child {
  // width: 100%;
  // height: 100%;
  scrolling: no;
  frameborder: 0;
  border: 0;
  marginwidth: 0;
  marginheight: 0;
}
</style>

三、preview-file使用

1.template中使用方式

<!-- 查看附件 -->
    <van-popup v-model:show="previewFile.fileShow">
      <preview-file v-if="previewFile.fileShow" :file="previewFile.fileMessage" @downLoadFile="downLoadFile">
      </preview-file>
    </van-popup>

2.方法处理:

// 预览文件
const previewFile = reactive({
  fileShow: false,
  fileMessage: {
    id: '',
    fileName: '',
    downloadUrl: '',
  }
});

// 下载附件 适配PC Iphone Android
const handleDownFile = (file: any) => {

  // 不是企业微信
  if (!isWxWork()) {

    return drNotify('请用企业微信打开');

  }

  isMobile() ?

    (isAndroid() ? window.open(handleImgSrc(file.group, file.filepath)) : handlePreviewFile(file))

    :

    PCpreview(file);
}

// pc端预览文件
const PCpreview = (file: any) => {

  previewFile.fileMessage.id = file.id;

  previewFile.fileMessage.fileName = file.filename;

// handleImgSrc --- 为下载的路径
  previewFile.fileMessage.downloadUrl = handleImgSrc(file.group, file.filepath);

  previewFile.fileShow = true;

}

// 下载附件  PC端
const downLoadFile = (id: string | number) => {

  previewFile.fileShow = false;

  downloadLogFile.derive({ id }).then((res: any) => {

    if (!res.message) { }

  })
}

PS:Iphone与Android区分开来的原因:使用企业微信提供的文件预览的功能,Android使用会自动跳转浏览器并下载。

效果图展示:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

浅析能源物联网技术在校园能耗监测系统中的应用与研究

摘要:绿色环保已成为时代的主题&#xff0c;与此同时&#xff0c;节能减排也成为我国蓝天保卫战的重要措施。我国大型公共建筑年耗电量约占全国城镇总耗电量的22%&#xff0c;每平方米年耗电量是普通居民住宅的10&#xff5e;20倍&#xff0c;是欧洲、日本等发达国家同类建筑的…

《四》多线程基础——Java线程生命周期及转换

Java并发编程系列文章 《一》多线程基础——Java线程与进程的基本概念 《二》多线程基础——Java线程入门类和接口 《三》多线程基础——Java线程组和线程优先级 《四》多线程基础——Java线程生命周期及转换 《五》多线程基础——Java线程间的通信&#xff08;互斥与协作&…

Git统计代码行数;Java实现统计代码行数,忽略空行、注释行

前言 某天&#xff0c;产品叫我算下某个项目的代码行数&#xff0c;我一愣&#xff0c;这怎么统计&#xff1f;总不可能一个文件一个文件算吧&#xff1f;后面我找了下&#xff0c;git是可以统计提交到仓库的所有的代码的&#xff0c;不过有个问题&#xff0c;就是假如有些文件…

在STM32F103C8T6上使用RT_Thread Nano移植控制台和Finsh

一、移植环境&#xff1a; 开发环境&#xff1a;Keil MDK 5.33 硬件平台&#xff1a;STM32F103C8T6 RT_Thread版本&#xff1a;RT-Thread Nano V3.1.5 二、在RT-Thread Nano V3.1.5添加uart控制台 1.需要在rtconfig.h开启以下两个宏 1&#xff09;#define RT_USING_CONSO…

ITK (1)窗宽窗位的意义与设置

背景与意义 医学图像与传统可视化图像相比&#xff0c;其具有更大的“灰度”范围。如&#xff0c;普通图像&#xff08;灰度图像&#xff09;的灰度范围一般是256级&#xff08;即图像中最亮的点的灰度值定义为0&#xff0c;最亮的定义为255&#xff0c;也就是2^8&#xff0c;…

【图像处理OpenCV(C++版)】——2.1 深入理解OpenCV之Mat类及相关成员函数

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

【论文阅读31】《OptCuts: Joint Optimization of Surface Cuts and Parameterization》

目录 一些疑惑 0 引言 1 introduction 2 related work 2.1 parameterization with fixed connectivity 2.2 Separate Cut Computation 3 problem statement ​编辑​ 3.1 数学形式1 3.2 数学形式2 3.3 能量函数 3.3.1 接缝线长度&#xff08;归一化&#xff09;&am…

程序员们,你会考虑使用中文编程吗?

众所周知&#xff0c;编程语言有一条无形的“鄙视链”。 Java和C#相互不服&#xff0c;并且看不起写Python的&#xff0c;Python看不起PHP&#xff0c;PHP看不起前端。而中文编程就在这个语言“鄙视链”的底端艰难生存。 有人对中文编程嗤之以鼻&#xff0c;相比于“人生苦短…

免费网课题库系统接口

免费网课题库系统接口 本平台优点&#xff1a;免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a;题库后台http://daili.jueguangzhe.cn/ 题…

[附源码]计算机毕业设计JAVA职业中介信息管理系统

[附源码]计算机毕业设计JAVA职业中介信息管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

Java进阶——IO流(I)

文章目录IO流一、文件1.1、文件流1.2、常用的文件操作1.2.1、创建文件对象相关构造和方法1.2.2、获取文件的相关信息1.2.3、目录的操作和文件删除二、IO流原理及流的分类2.1、Java IO流的原理2.2、流的分类2.3、IO流常用的类2.3.1、InputStream&#xff1a;字节输入流FileInput…

SSH 远程连接协议详解

一、SSH 协议 1、SSH 协议简介 SSH全称是Secure Shell,SSH协议是基于应用层的协议,为远程登录会话和其他网络服务提供安全性的协议。 SSH使用最多的是远程登录和传输文件,实现此功能的传统协议都不安全(ftp、telnet等),因为它们使用明文传输数据,而SSH在传输过程中的…

【云原生.docker】docker部署Redis集群

1、镜像拉取 docker pull redis:5.0.5 2、容器启动 docker run -d --nameredis-6400 --net host --privilegedtrue -v /home/dev/toms/docker_redis/data/redis-6400:/data redis:5.0.5 --cluster-enabled yes --appendonly yes --port 6400 & docker run -d --nameredis-…

在抖音及一些直播上,如何进行违禁词在线检测呢?

本文首发于&#xff1a;行者AI谛听 随着直播行业的兴起&#xff0c;越来越多的网红主播纷纷加入&#xff0c;平台的审核能力也面临着巨大的挑战&#xff0c;相对于平台的严格监管&#xff0c;很多主播也需要进行深层学习&#xff0c;避免在直播中出行违规。 其实很多主播在直播…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java小型餐饮综合管理系统j1c7m

首先选择计算机题目的时候先看定什么主题&#xff0c;一般的话都选择当年最热门的话题进行组题&#xff0c;就比如说&#xff0c;今年的热门话题有奥运会&#xff0c;全运会&#xff0c;残运会&#xff0c;或者疫情相关的&#xff0c;这些都是热门话题&#xff0c;所以你就可以…

文档对象模型 (DOM) :初学者介绍和指南

果你已经使用JavaScript一段时间了&#xff0c;你可能相当熟悉DOM&#xff08;文档对象模型&#xff09;和CSSOM&#xff08;CSS对象模型&#xff09;脚本。除了 DOM 和 CSSOM 规范定义的接口之外&#xff0c;CSSOM 视图模块中还指定了方法和属性的子集&#xff0c;从而提供了用…

Vue3知识点之数据侦测

Vue 的核心之一就是响应式系统&#xff0c;通过侦测数据的变化&#xff0c;来驱动更新视图。 实现可响应对象的方式 通过可响应对象&#xff0c;实现对数据的侦测&#xff0c;从而告知外界数据变化。实现可响应对象的方式&#xff1a; getter 和 setterdefinePropertyProxy …

IB课程工具书单,助力你考高分

亚马逊汇总了近期最畅销的IB课程工具书单&#xff0c;该书单以购买量和评分进行综合排名。其中的许多书籍都是IBDP学生可选用的绝佳工具书&#xff01;1、Physics for the IB Diploma Coursebook 这本书涵盖了IB 2016年首考的物理课程要求。这本课程手册的第六版针对IB物理教学…

写出go程序

1.安装go包 下载地址&#xff1a;https://golang.google.cn/dl/ 2.安装vscode 下载地址&#xff1a;https://code.visualstudio.com/ 安装好后 以打开文件夹形式打开.go文件。 该文件自己创建一个即可。

怎么视频提取音频文件?分享这3种简单实用的提取方法

不知道大家平时用手机刷视频的时候&#xff0c;会不会被一些好听的背景音乐给吸引了呢&#xff1f;这些背景音乐大多都是网友们自己合成导入视频上传的&#xff0c;可能在许多音乐平台都不能找到音源播放。遇到这样的情况&#xff0c;大家一定都很苦恼吧&#xff1f;但其实&…