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

注意事项:

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

vue前端实现文件预览

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

相关文章

vue怎么实现选中删除

vue怎么实现选中删除

实现选中删除功能的方法 在Vue中实现选中删除功能通常涉及以下几个关键步骤: 数据绑定与选中状态管理 使用v-model或v-for指令绑定列表数据,结合复选框或单选按钮实现选中状态管理。例如:…

vue实现微博印象

vue实现微博印象

实现微博印象功能的核心思路 微博印象功能通常指用户发布微博后,系统自动分析文本内容并提取关键词或标签,以可视化形式展示。Vue实现该功能需要结合文本分析、关键词提取和前端渲染技术。 文本分析与关键…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debo…

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginatedD…

vue实现右下角弹框

vue实现右下角弹框

实现右下角弹框的基本思路 在Vue中实现右下角弹框,通常需要结合CSS定位和Vue的组件化特性。弹框可以通过绝对定位固定在右下角,并通过Vue控制其显示与隐藏。 创建弹框组件 新建一个Vue组件(…

vue实现打印二维码

vue实现打印二维码

安装二维码生成库 使用 qrcode 或 vue-qrcode 库生成二维码。通过 npm 安装: npm install qrcode vue-qrcode 生成二维码 在 Vue 组…