【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')
相关推荐
এ慕ོ冬℘゜5 小时前
ES Promise.all/ Promise.race
前端·javascript·elasticsearch
只睡四小时6 小时前
端侧推理:face-api.js 首屏 92% 是白下载的
开发语言·javascript·人脸识别·ecmascript·tensorflow.js·face-api.js·端侧推理
用户83134859306987 小时前
Vue3 v-for:常用用法与开发高频坑点
前端·javascript·vue.js
Funlang7 小时前
fun-ui 开源:把浏览器界面接回来
前端·javascript
2603_965896627 小时前
CSS BEM 命名规范|组件化样式分层权威指南
前端·javascript·css
忆挽篱笙歌8 小时前
进程替换函数与shenll命令行解释器
前端·javascript·算法
小冯不疯8 小时前
688 / 拼多多 / 淘特三类供货链路:从采购单到应付凭证的 4 段对账
javascript
moshuying8 小时前
DeppInfer系列之 - 矩阵、注意力与 GPU:拆解 DeepGEMM 与 FlashMLA
前端·javascript·面试
Jack N9 小时前
【Strapi 系列之五】前端怎么接?Next.js + Tailwind 拉取 Strapi 数据(含代码)
开发语言·前端·javascript·strapi
weedsfly10 小时前
React 不可变数据:为什么页面“明明数据变了却不更新
前端·javascript·react.js