当前位置:首页 > VUE

vue实现视频下载功能

2026-01-20 16:56:38VUE

使用 Blob 对象和 URL.createObjectURL 下载

在 Vue 中实现视频下载功能,可以通过将视频文件转换为 Blob 对象,并使用 URL.createObjectURL 创建下载链接。这种方法适用于从后端获取视频文件流或直接下载网络资源。

// 在 methods 中定义下载方法
downloadVideo() {
  fetch('视频URL')
    .then(response => response.blob())
    .then(blob => {
      const url = window.URL.createObjectURL(blob)
      const a = document.createElement('a')
      a.href = url
      a.download = '视频文件名.mp4'
      document.body.appendChild(a)
      a.click()
      window.URL.revokeObjectURL(url)
      document.body.removeChild(a)
    })
    .catch(error => console.error('下载失败:', error))
}

使用 axios 下载并显示进度

如果需要显示下载进度,可以使用 axios 库。这种方式更适合需要用户交互和反馈的场景。

import axios from 'axios'

// 在 methods 中定义带进度条的下载方法
downloadVideoWithProgress() {
  axios({
    url: '视频URL',
    method: 'GET',
    responseType: 'blob',
    onDownloadProgress: progressEvent => {
      const percentCompleted = Math.round(
        (progressEvent.loaded * 100) / progressEvent.total
      )
      console.log(percentCompleted + '%')
      // 可以在这里更新UI进度条
    }
  }).then(response => {
    const url = window.URL.createObjectURL(new Blob([response.data]))
    const link = document.createElement('a')
    link.href = url
    link.setAttribute('download', '视频文件.mp4')
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
  })
}

处理跨域问题

如果视频资源存在跨域限制,需要在服务器端设置 CORS 头或使用代理。对于前端解决方案,可以尝试以下方法:

// 使用 crossorigin 属性
const video = document.createElement('video')
video.crossOrigin = 'anonymous'
video.src = '视频URL'
video.addEventListener('loadedmetadata', () => {
  // 下载逻辑
})

分片下载大文件

对于大文件视频,可以实现分片下载以提高可靠性和用户体验:

async function downloadLargeVideo() {
  const chunkSize = 1024 * 1024 // 1MB chunks
  let startByte = 0
  let endByte = chunkSize
  const videoSize = await getVideoSize() // 需要实现获取视频大小的方法
  const chunks = []

  while (startByte < videoSize) {
    const chunk = await fetchChunk(startByte, endByte)
    chunks.push(chunk)
    startByte = endByte
    endByte = Math.min(endByte + chunkSize, videoSize)
  }

  const fullBlob = new Blob(chunks)
  const url = URL.createObjectURL(fullBlob)
  // 创建下载链接...
}

前端直接下载本地视频

如果视频已经在页面中播放,可以通过 canvas 捕获并下载:

vue实现视频下载功能

downloadLocalVideo() {
  const video = document.getElementById('videoElement')
  const canvas = document.createElement('canvas')
  canvas.width = video.videoWidth
  canvas.height = video.videoHeight
  canvas.getContext('2d').drawImage(video, 0, 0)

  canvas.toBlob(blob => {
    const url = URL.createObjectURL(blob)
    const a = document.createElement('a')
    a.href = url
    a.download = 'captured-video.mp4'
    a.click()
  }, 'video/mp4')
}

分享给朋友:

相关文章

前端实现拖拽功能vue

前端实现拖拽功能vue

使用 HTML5 拖放 API 在 Vue 中可以通过 HTML5 的原生拖放 API 实现拖拽功能。需要监听 dragstart、dragover 和 drop 事件。 <template&…

php实现留言板功能

php实现留言板功能

PHP 留言板功能实现 数据库设计 创建数据库表 messages,包含以下字段: id:自增主键 name:留言者姓名(VARCHAR) email:留言者邮箱(VARCHAR) content:…

vue实现功能插件

vue实现功能插件

Vue 功能插件实现方法 插件基本结构 Vue 插件通常需要暴露一个 install 方法,该方法接收 Vue 构造函数作为参数。基本结构如下: const MyPlugin = { insta…

vue实现粘贴功能

vue实现粘贴功能

实现粘贴功能的基本方法 在Vue中实现粘贴功能通常涉及监听paste事件,并处理剪贴板数据。以下是一个基础实现示例: <template> <div @paste="handl…

vue实现模态功能

vue实现模态功能

Vue 实现模态框功能 方法一:使用组件和v-if/v-show控制显示 创建独立的模态框组件(如Modal.vue),通过props接收标题、内容等数据,使用v-if或v-show控制显示状态。…

php秒杀功能的实现

php秒杀功能的实现

秒杀功能的核心设计 高并发场景下秒杀系统的核心在于解决超卖问题和性能瓶颈。需要结合缓存、队列、锁机制等技术实现。 数据库设计 商品表需包含库存字段,例如: CREATE TABLE `seckil…