结合 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 实现大文件分片上传

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

视频管理功能

视频列表展示

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

错误处理机制

vue实现视频上传管理

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

优化建议

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

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

相关文章

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

h5实现抖音刷视频

h5实现抖音刷视频

实现抖音刷视频的H5页面 实现类似抖音的刷视频功能需要结合H5的视频播放、手势交互和无限滚动等技术。以下是关键实现步骤: 视频播放与布局 使用HTML5的<video>标签实现视频播放容…

vue webrtc实现视频

vue webrtc实现视频

Vue 与 WebRTC 实现视频通信 WebRTC(Web Real-Time Communication)是一种支持浏览器实时音视频通信的技术。结合 Vue.js 框架,可以快速构建视频通话应用。…

vue实现播放视频

vue实现播放视频

vue实现播放视频的方法 使用Vue实现视频播放可以通过HTML5的<video>标签或第三方库完成。以下是几种常见方法: 使用原生HTML5 video标签 在Vue组件模板中直接使…

Vue实现视频截图

Vue实现视频截图

Vue实现视频截图的步骤 在Vue中实现视频截图功能,可以通过HTML5的<video>元素和Canvas API来完成。以下是具体实现方法: 创建视频元素和Canvas 在Vue组件的…

vue java实现分片上传

vue java实现分片上传

分片上传的实现原理 分片上传是将大文件分割成多个小块分别上传,最后在服务器合并的技术。这种方式能解决大文件上传超时、网络不稳定等问题,同时支持断点续传。 前端Vue实现 前端需要使用File API…