【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')
相关推荐
雪芽蓝域zzs3 小时前
第4节:el-select 弹窗事件控制(打开 / 关闭、选中事件、弹窗滚动事件)
vue.js·elementui
PYB33 小时前
【Web·JS·基础】函数的使用和展运算符...objs
前端·javascript
默_笙4 小时前
🚥 给 RAG 装一台心电监护仪:LangSmith 全链路观测(上)
前端·javascript
变与不变8065 小时前
js同步和异步难点重点详解
开发语言·javascript·ecmascript
Dovis(誓平步青云)6 小时前
多个链接不等于多份证据,新闻核验看板怎样合并来源
java·服务器·前端·javascript·人工智能·pdf·电脑
Dovis(誓平步青云)6 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
可乐鸡翅yeah_8 小时前
fmp4 碎片 MP4 格式 HLS 流,和传统 TS 分片有什么不一样
开发语言·javascript·ios·音视频·safari·m3u8·m3u8在线播放
ss2739 小时前
AI全栈实战 | 2.3-01 组件库实战:Element Plus 怎么搭出专业界面,过度封装为什么成维护负担
前端·javascript·elementui·vue
福兮说9 小时前
URL 编码的七个坑:c++ 传到后端变空格、%25 套娃、截断 emoji 直接报错
开发语言·前端·javascript·node.js·url
小的时候可菜了9 小时前
JS 异步的本质:从单线程到 thenable(一条进化链)
开发语言·前端·javascript