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>
相关推荐
牛奶11 分钟前
AI双层代码治理:Monorepo × Harness Engineering
前端·aigc·ai编程
蜡台17 分钟前
H5使用Chrome 权限问题
前端·javascript·chrome
掘金一周24 分钟前
你们觉得房贷多少,没有压力 | 沸点周刊 4.30
前端·人工智能·后端
大貔貅喝啤酒25 分钟前
接口测试_Postman(详细版)
javascript·测试工具·node.js·自动化·postman
小小码农Come on26 分钟前
QML访问子项内容
前端·javascript·html
桜吹雪39 分钟前
Langchain.js官方文档:构建具备按需加载技能的 SQL 助手
javascript·人工智能·node.js
han_1 小时前
一篇看懂国内外主流大模型:GPT、Claude、Gemini、DeepSeek、通义千问有什么区别?
前端·人工智能·llm
一行代码一行诗++1 小时前
注释是什么和注释该怎么写(C语言)
java·前端·javascript
涂兵兵_青石疏影1 小时前
beginPath-vs-save详解
前端
陈振wx:zchen20081 小时前
前端-面试题-JavaScript
javascript·前端面试题