【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')
相关推荐
宿6748 小时前
vue3-包管理器
前端·vue.js
mayaairi9 小时前
Vue2 生命周期完全指南:从创建到销毁的8个钩子函数
前端·javascript·vue.js
研☆香10 小时前
一个简单的气泡弹窗制作
javascript
大模型丫丫10 小时前
用 TypeScript、NestJS 和 LangGraph 搭建一个可控的 AI Agent
javascript·人工智能·typescript
IMPYLH10 小时前
HTML 的 <pre> 元素
前端·javascript·html
shmily麻瓜小菜鸡11 小时前
JavaScript / TypeScript 易踩坑知识点 —— 异步编程类
开发语言·javascript·typescript
tsumikistep11 小时前
【前端】Vue + Axios 跨域问题实战:7070 代理转发 8080 + 401 报错分析(黑马外卖)
前端·javascript·vue.js
今日无bug13 小时前
从0到1手撕流式输出:Vue3 + Vite 实现 LLM 流式响应全解析
前端·vue.js·vite
默_笙13 小时前
🧀 用户访问一个网站到底经历了什么?全栈部署的"城市观光"指南
前端·javascript
晓天衡宇•评测社区15 小时前
Seedance 2.5 登顶图生视频榜单,Wan 3.0 在游戏与教育场景进入前列
前端·javascript·网络