【Vue】vue3实现文件预览组件(预览服务使用kkfileview)

还是一样,先看效果

安装base64

java 复制代码
 npm install js-base64 --save-dev

预览组件

java 复制代码
<template>
  <el-dialog
    v-model="dialogVisible"
    :title="'文件预览'"
    width="80%"
    top="5vh"
    destroy-on-close
    custom-class="preview-dialog"
    :close-on-click-modal="true"
    @close="handleClose"
  >
    <div class="preview-container">
      <iframe :src="iframeSrc" class="preview-iframe" frameborder="0" allowfullscreen></iframe>
    </div>

    <template #footer>
      <div class="dialog-footer">
        <el-button @click="dialogVisible = false">关闭</el-button>
        <el-button type="primary" @click="downloadFile">
          <el-icon><Download /></el-icon>
          下载文件
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>

<script setup>
import { ref, computed } from 'vue';
import { Download } from '@element-plus/icons-vue';
import { Base64 } from 'js-base64';
const props = defineProps({
  fileUrl: {
    type: String,
    required: true
  }
});

const emit = defineEmits(['close']);
const dialogVisible = ref(true);
const kkfileviewUrl='http://ip:8012/onlinePreview'
// 生成KKFileView预览URL
const iframeSrc = computed(() => {
  const encodedUrl = encodeURIComponent(Base64.encode(props.fileUrl));
  return `${kkfileviewUrl}?url=${encodedUrl}`;
});

const handleClose = () => {
  emit('close');
};

const downloadFile = () => {
  const link = document.createElement('a');
  link.href = props.fileUrl;
  link.download = props.fileName || 'download';
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
};
</script>

<style scoped>
.preview-container {
  height: 70vh;
  background-color: #f5f7fa;
  border-radius: 4px;
  overflow: hidden;
}

.preview-iframe {
  width: 100%;
  height: 100%;
  border: none;
}

.dialog-footer {
  display: flex;
  justify-content: flex-end;
  gap: 12px;
}

/* 自定义对话框样式 */
:deep(.preview-dialog) {
  border-radius: 8px;
}

:deep(.preview-dialog .el-dialog__header) {
  padding: 16px 20px;
  border-bottom: 1px solid var(--el-border-color-light);
}

:deep(.preview-dialog .el-dialog__body) {
  padding: 0;
}
</style>
用法
java 复制代码
//使用组件
    <KKFilePreview
      v-if="showDialog"
      :file-url="previewUrl"
      @close="showDialog = false"
    />
    
    //预览组件属性
	const showDialog = ref(false)
	const previewUrl = ref('http://xxxx.jpg')
相关推荐
大橙子额8 小时前
【解决报错】Cannot assign to read only property ‘exports‘ of object ‘#<Object>‘
前端·javascript·vue.js
WooaiJava9 小时前
AI 智能助手项目面试技术要点总结(前端部分)
javascript·大模型·html5
LYFlied9 小时前
从 Vue 到 React,再到 React Native:资深前端开发者的平滑过渡指南
vue.js·react native·react.js
Never_Satisfied10 小时前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌4110 小时前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
B站_计算机毕业设计之家10 小时前
豆瓣电影数据采集分析推荐系统 | Python Vue Flask框架 LSTM Echarts多技术融合开发 毕业设计源码 计算机
vue.js·python·机器学习·flask·echarts·lstm·推荐算法
WeiXiao_Hyy10 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
xjt_090111 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农11 小时前
Vue 2.3
前端·javascript·vue.js
辰风沐阳12 小时前
JavaScript 的宏任务和微任务
javascript