结合 Vue 的 v-on:change 事件监听文件选择 <…">
当前位置:首页 > VUE

vue实现视频上传管理

2026-03-26 22:55:02VUE

Vue 视频上传管理实现方案

前端部分(Vue.js)

文件选择与预览 使用 <input type="file"> 结合 Vue 的 v-on:change 事件监听文件选择

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

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

分片上传实现 使用 axios 实现大文件分片上传

vue实现视频上传管理

async uploadChunks(file) {
  const chunkSize = 5 * 1024 * 1024 // 5MB
  const chunks = Math.ceil(file.size / chunkSize)
  const uploadId = Date.now().toString()

  for (let i = 0; i < chunks; i++) {
    const start = i * chunkSize
    const end = Math.min(start + chunkSize, file.size)
    const chunk = file.slice(start, end)

    const formData = new FormData()
    formData.append('chunk', chunk)
    formData.append('chunkIndex', i)
    formData.append('totalChunks', chunks)
    formData.append('uploadId', uploadId)
    formData.append('filename', file.name)

    await axios.post('/api/upload', formData, {
      headers: { 'Content-Type': 'multipart/form-data' }
    })
  }
}

后端部分(Node.js示例)

接收分片并合并

const fs = require('fs')
const path = require('path')
const multer = require('multer')

// 临时存储分片
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    const uploadId = req.body.uploadId
    const dir = `./temp/${uploadId}`
    fs.mkdirSync(dir, { recursive: true })
    cb(null, dir)
  },
  filename: (req, file, cb) => {
    cb(null, `${req.body.chunkIndex}`)
  }
})

// 合并分片
app.post('/merge', (req, res) => {
  const { uploadId, filename, totalChunks } = req.body
  const dir = `./temp/${uploadId}`
  const writeStream = fs.createWriteStream(`./uploads/${filename}`)

  for (let i = 0; i < totalChunks; i++) {
    const chunkPath = path.join(dir, i.toString())
    const chunk = fs.readFileSync(chunkPath)
    writeStream.write(chunk)
    fs.unlinkSync(chunkPath)
  }

  writeStream.end()
  fs.rmdirSync(dir)
  res.send({ success: true })
})

视频管理功能

视频列表展示

vue实现视频上传管理

<template>
  <div v-for="video in videos" :key="video.id">
    <video :src="video.url" controls width="300"></video>
    <p>{{ video.name }}</p>
    <button @click="deleteVideo(video.id)">删除</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      videos: []
    }
  },
  mounted() {
    this.fetchVideos()
  },
  methods: {
    async fetchVideos() {
      const res = await axios.get('/api/videos')
      this.videos = res.data
    },
    async deleteVideo(id) {
      await axios.delete(`/api/videos/${id}`)
      this.fetchVideos()
    }
  }
}
</script>

进度显示与错误处理

上传进度条

axios.post('/api/upload', formData, {
  headers: { 'Content-Type': 'multipart/form-data' },
  onUploadProgress: progressEvent => {
    const percent = Math.round(
      (progressEvent.loaded * 100) / progressEvent.total
    )
    this.uploadProgress = percent
  }
})

错误处理机制

try {
  await uploadChunks(file)
} catch (error) {
  console.error('上传失败:', error)
  this.uploadError = '上传失败,请重试'
  if (error.response?.status === 413) {
    this.uploadError = '文件过大,请选择小于2GB的视频'
  }
}

优化建议

  • 使用 Web Worker 处理大文件分片计算
  • 实现断点续传功能,保存已上传分片信息
  • 添加视频格式校验(MP4/WebM等)
  • 实现视频封面自动生成功能
  • 添加上传速度限制和并发控制

标签: 上传视频
分享给朋友:

相关文章

h5 实现视频通话

h5 实现视频通话

H5 实现视频通话的技术方案 H5(HTML5)实现视频通话主要依赖WebRTC(Web Real-Time Communication)技术。以下是实现步骤和关键代码示例: 获取用户媒体设备权限…

vue实现上传封面

vue实现上传封面

Vue 实现上传封面功能 使用原生 input 文件上传 在 Vue 中可以通过原生 HTML 的 input 元素实现文件上传功能。创建一个文件输入框,监听 change 事件获取用户选择的文件。…

vue视频列表实现

vue视频列表实现

Vue 视频列表实现 数据准备 定义一个数组存储视频信息,每个视频对象包含标题、封面图、播放地址等属性。 data() { return { videos: [ {…

vue实现视频弹幕

vue实现视频弹幕

Vue 实现视频弹幕功能 实现视频弹幕功能需要结合视频播放器和弹幕渲染逻辑,以下是具体实现方法: 视频播放器集成 使用第三方视频播放器库如video.js或原生video标签作为基础: <v…

vue实现录视频

vue实现录视频

Vue 实现录视频功能 使用浏览器 API 实现录屏 在 Vue 项目中可以通过浏览器提供的 MediaDevices API 和 MediaRecorder API 实现录屏功能。需要确保浏览器支持…

vue实现视频倒放

vue实现视频倒放

实现视频倒放的方法 在Vue中实现视频倒放可以通过多种方式完成,以下是几种常见的方法: 使用HTML5 Video API和Canvas 通过HTML5 Video API和Canvas可以实现视频…