结合 URL.createObjectURL() 实现本地图片预览:
当前位置:首页 > VUE

vue前端实现文件预览

2026-01-20 07:11:52VUE

Vue 前端实现文件预览的方法

图片预览

使用 <input type="file"> 结合 URL.createObjectURL() 实现本地图片预览:

<template>
  <div>
    <input type="file" @change="previewImage" accept="image/*">
    <img v-if="imageUrl" :src="imageUrl" width="200">
  </div>
</template>

<script>
export default {
  data() {
    return {
      imageUrl: null
    }
  },
  methods: {
    previewImage(e) {
      const file = e.target.files[0]
      this.imageUrl = URL.createObjectURL(file)
    }
  }
}
</script>

PDF 预览

通过 pdf.js 库实现 PDF 预览:

npm install pdfjs-dist

组件实现:

<template>
  <div>
    <input type="file" @change="previewPdf" accept=".pdf">
    <canvas ref="pdfCanvas"></canvas>
  </div>
</template>

<script>
import * as pdfjsLib from 'pdfjs-dist'
export default {
  methods: {
    async previewPdf(e) {
      const file = e.target.files[0]
      const arrayBuffer = await file.arrayBuffer()
      const pdf = await pdfjsLib.getDocument(arrayBuffer).promise
      const page = await pdf.getPage(1)
      const viewport = page.getViewport({ scale: 1.0 })
      const canvas = this.$refs.pdfCanvas
      canvas.height = viewport.height
      canvas.width = viewport.width
      await page.render({
        canvasContext: canvas.getContext('2d'),
        viewport
      }).promise
    }
  }
}
</script>

Office 文档预览

使用微软官方 Office Online 预览:

vue前端实现文件预览

<template>
  <iframe 
    :src="`https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(fileUrl)}`"
    width="100%"
    height="500px"
    frameborder="0"
  ></iframe>
</template>

视频/音频预览

HTML5 原生媒体元素实现:

<template>
  <div>
    <input type="file" @change="previewVideo" accept="video/*">
    <video v-if="videoUrl" :src="videoUrl" controls width="400"></video>
  </div>
</template>

<script>
export default {
  data() {
    return {
      videoUrl: null
    }
  },
  methods: {
    previewVideo(e) {
      const file = e.target.files[0]
      this.videoUrl = URL.createObjectURL(file)
    }
  }
}
</script>

文本文件预览

使用 <textarea><pre> 标签显示文本内容:

vue前端实现文件预览

<template>
  <div>
    <input type="file" @change="previewText" accept=".txt,.json,.xml,.csv">
    <pre v-if="textContent">{{ textContent }}</pre>
  </div>
</template>

<script>
export default {
  data() {
    return {
      textContent: null
    }
  },
  methods: {
    previewText(e) {
      const file = e.target.files[0]
      const reader = new FileReader()
      reader.onload = (event) => {
        this.textContent = event.target.result
      }
      reader.readAsText(file)
    }
  }
}
</script>

第三方库集成

使用 vue-file-preview 等现成组件:

npm install vue-file-preview

基本用法:

<template>
  <vue-file-preview :file="file"></vue-file-preview>
</template>

<script>
import VueFilePreview from 'vue-file-preview'
export default {
  components: { VueFilePreview },
  data() {
    return {
      file: null
    }
  }
}
</script>

注意事项:

  • 大文件预览需考虑性能问题,建议限制文件大小
  • 使用 URL.revokeObjectURL() 释放内存
  • 敏感文件建议在后端转换后返回安全预览内容
  • 跨域文件需配置 CORS 或使用代理服务

标签: 文件vue
分享给朋友:

相关文章

vue实现下拉菜单

vue实现下拉菜单

实现下拉菜单的基本思路 使用Vue实现下拉菜单可以通过动态绑定v-show或v-if控制菜单显示隐藏,结合事件监听(如@click或@mouseenter)触发状态切换。以下是两种常见实现方式: 方…

vue里实现增删改查

vue里实现增删改查

在Vue中实现增删改查 数据初始化 在Vue组件的data中定义初始数据和表单绑定的变量: data() { return { items: [ { id: 1, name:…

vue实现granfana

vue实现granfana

Vue 实现类似 Grafana 的仪表盘 要在 Vue 中实现类似 Grafana 的仪表盘功能,需要结合数据可视化库、状态管理和 UI 组件。以下是关键步骤和推荐工具: 数据可视化库 使用 E…

vue vnode实现

vue vnode实现

Vue VNode 实现原理 VNode(Virtual Node)是 Vue 的核心概念之一,用于描述真实 DOM 的轻量级虚拟表示。VNode 的实现涉及以下关键点: VNode 的基本结构 V…

vue实现hover

vue实现hover

Vue 实现 hover 效果的方法 在 Vue 中实现 hover 效果可以通过多种方式实现,包括使用 CSS、Vue 指令或事件监听。以下是几种常见的方法: 使用 CSS :hover 伪类 通…

vue实现全屏

vue实现全屏

Vue 实现全屏功能的方法 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 来实现。以下是几种常见的实现方式: 使用原生 Fullscreen API 通过调用 doc…