结合 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 预览:

<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> 标签显示文本内容:

<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>

注意事项:

vue前端实现文件预览

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

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

相关文章

vue实现前端注册

vue实现前端注册

Vue 实现前端注册功能 注册表单设计 使用 Vue 的模板语法创建注册表单,包含用户名、邮箱、密码和确认密码字段。表单需绑定 v-model 实现双向数据绑定。 <template>…

vue实现付款

vue实现付款

Vue 实现付款功能 在 Vue 中实现付款功能通常需要集成第三方支付网关(如支付宝、微信支付、Stripe 等)。以下是常见的实现方法: 集成支付宝/微信支付 安装必要的依赖(如 axios 用于…

vue实现triger

vue实现triger

在Vue中实现触发器(trigger)功能通常涉及自定义事件或DOM事件触发。以下是几种常见场景的实现方法: 自定义事件触发 通过$emit方法触发父组件中监听的自定义事件: // 子组件 thi…

vue实现分类

vue实现分类

Vue实现分类功能的方法 使用v-for和计算属性 通过计算属性对数据进行分类处理,结合v-for渲染分类后的列表。示例代码: <template> <div>…

vue实现抖动

vue实现抖动

Vue 实现抖动效果 在 Vue 中实现抖动效果可以通过 CSS 动画或 JavaScript 动画库来实现。以下是几种常见的方法: 使用 CSS 动画 通过定义 @keyframes 动画并在 V…

vue实现验证

vue实现验证

Vue 表单验证实现方法 在Vue中实现表单验证可以通过多种方式完成,以下是常见的几种方法: 使用Vuelidate库 Vuelidate是一个轻量级的Vue表单验证库,安装后可以通过简单的配置实现…