Vue3使用kkFileView预览文件pdf

kkFileView - 在线文件预览kkFileView官网 - kkFileView使用Spring Boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,Excel,pdf,txt,zip,rar,图片等等https://kkfileview.keking.cn/zh-cn/docs/usage.html业务场景:需要点击按钮,弹出弹框预览pdf文件

这里使用的是3.x.x 版本,需要下载base64

3.x.x 版本 # 示例

复制代码
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/js-base64@3.6.0/base64.min.js"></script>

var originUrl = 'http://127.0.0.1:8080/filedownload?fileId=1'; //要预览文件的访问地址
var previewUrl = originUrl + '&fullfilename=test.txt'
window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(previewUrl)));

配置baseUrl,如果是生产环境,走 location.origin 浏览器的当前地址,它包含了协议、域名和端口号,否则走项目配置中设置的环境变量 VITE_APP_API_URL 的值。

替换示例的文件地址,打开弹窗时把地址传给弹窗,弹窗里使用iframe

javascript 复制代码
// 预览
    const handleClickOpenPreview = (row) => {
      if (row.fileState === '无') return
      const baseUrl = import.meta.env.PROD ? location.origin : import.meta.env.VITE_APP_API_URL
      
      // const originUrl = baseUrl + '/hs/document/downloadWord' + '?fileName=010001_20231015_1697332623776.docx'
      // const previewUrl = originUrl + '&fullfilename=010001_20231015_1697332623776.docx'
      
      // window.open('http://100.100.120.147:8012/preview/onlinePreview?url=' + encodeURIComponent(Base64.encode(previewUrl)));
      // window.open(baseUrl + '/preview/onlinePreview?url=' + encodeURIComponent(Base64.encode(previewUrl)));
      
      const originUrl = baseUrl + '/hs/document/downloadWord' + `?fileName=${row.fileName}`
      const previewUrl = originUrl + `&fullfilename=${row.fileName}`
      const url = baseUrl + '/preview/onlinePreview?url=' + encodeURIComponent(Base64.encode(previewUrl))
      state.PreViewFileDialogRef.open(row, url) // 把url传给弹窗
    }

弹窗页

javascript 复制代码
<template>
  <PatrolDialog :show="show" @close="show = false" DeleteFooterBtn width="1370px" top="5vh">
    <template #title>
      <div class="dialog-title"><img :src="weatherStationIcon" />预览</div>
    </template>

    <div class="formPart">
      <el-dropdown trigger="click" @command="handleClickExport" size="small">
        <span class="el-dropdown-link">
          <i class="icon iconfont icon-daochu" style="color: var(--gdky-primary-color);"></i>
        </span>
        <template #dropdown>
          <el-dropdown-menu>
            <el-dropdown-item command="word">word</el-dropdown-item>
            <el-dropdown-item command="pdf">pdf</el-dropdown-item>
          </el-dropdown-menu>
        </template>
      </el-dropdown>
      <!-- 在弹窗中显示的内容 -->
      <iframe :src="pageUrl" width="100%" height="800px" class="file"></iframe>
    </div>
  </PatrolDialog>
</template>

<script>
import { reactive, toRefs, computed, watch } from 'vue'
import PatrolDialog from '@/views/Components/PatrolDialog.vue'
import weatherStationIcon from '@/assets/imgs/title_img.png'
import { exportWord, exportPdf } from '@/api/PlatTool/CustomModules/HeatSourceDispatch/index'

export default {
  components: {
    PatrolDialog
  },
  setup(_, { emit }) {

    const state = reactive({
      show: false,
      weatherStationIcon, // icon
      curRow: null,
      pageUrl: "",
    })


    const methods = {
      // 打开弹窗
      async open(curRow, url) {
        state.show = true;
        state.curRow = curRow;
        state.pageUrl = url
      },

      // 导出
      handleClickExport(command) {
        if (command === "word") {
          exportWord({ fileName: state.curRow.fileName })
        } else {
          exportPdf({ fileName: state.curRow.pdfFileName })
        }
      }
    }

    return {
      ...toRefs(state),
      ...methods,
    }
  }
}
</script>
<style lang='less' scoped>
.dialog-title {
  display: flex;
  font-size: 16px;
  font-family: MicrosoftYaHeiSemibold;
  color: var(--gdky-main-content-color);
  line-height: 24px;
  padding-bottom: var(--base-padding);

  img {
    margin-right: 8px;
  }
}

.formPart {
  display: flex;
  flex-direction: column;
  flex: 1;
  height: 100%;

  .file {
    display: flex;
    justify-content: center;
    align-items: center;
    margin-left: -15px;
    position: relative;
  }

  .el-dropdown-link {
    position: absolute;
    top: 5px;
    right: 88px;
    z-index: 999;
  }
}
</style>

<style lang="less">
.g-dark {
  .formPart {
    .el-dropdown-link {}
  }
}
</style>
相关推荐
前端一小卒10 分钟前
一个看似“送分”的需求为何翻车?——前端状态机实战指南
前端·javascript·面试
syt_101313 分钟前
Object.defineProperty和Proxy实现拦截的区别
开发语言·前端·javascript
遝靑16 分钟前
Flutter 跨端开发进阶:可复用自定义组件封装与多端适配实战(移动端 + Web + 桌面端)
前端·flutter
cypking22 分钟前
Web前端移动端开发常见问题及解决方案(完整版)
前端
长安牧笛25 分钟前
儿童屏幕时间管控学习引导系统,核心功能,绑定设备,设时长与时段,识别娱乐,APP超时锁屏,推荐益智内容,生成使用报告,学习达标解锁娱乐
javascript
老前端的功夫27 分钟前
Vue 3 vs Vue 2 深度解析:从架构革新到开发体验全面升级
前端·vue.js·架构
栀秋66637 分钟前
深入浅出链表操作:从Dummy节点到快慢指针的实战精要
前端·javascript·算法
狗哥哥1 小时前
Vue 3 动态菜单渲染优化实战:从白屏到“零延迟”体验
前端·vue.js
青青很轻_1 小时前
Vue自定义拖拽指令架构解析:从零到一实现元素自由拖拽
前端·javascript·vue.js
xhxxx1 小时前
从被追问到被点赞:我靠“哨兵+快慢指针”展示了面试官真正想看的代码思维
javascript·算法·面试