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>
相关推荐
有梦想的刺儿19 分钟前
webWorker基本用法
前端·javascript·vue.js
cy玩具40 分钟前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
清灵xmf1 小时前
TypeScript 类型进阶指南
javascript·typescript·泛型·t·infer
小白学大数据1 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
qq_390161771 小时前
防抖函数--应用场景及示例
前端·javascript
334554322 小时前
element动态表头合并表格
开发语言·javascript·ecmascript
John.liu_Test2 小时前
js下载excel示例demo
前端·javascript·excel
Yaml42 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
PleaSure乐事2 小时前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro