元素: <…">
当前位置:首页 > VUE

vue 实现视频上传

2026-02-18 18:28:03VUE

视频上传功能实现

在Vue中实现视频上传功能需要结合前端和后端的协作。以下是详细的实现方法:

前端实现

创建文件上传组件,使用<input type="file">元素:

<template>
  <div>
    <input type="file" accept="video/*" @change="handleFileUpload" />
    <button @click="uploadVideo">上传视频</button>
    <div v-if="progress > 0">上传进度: {{progress}}%</div>
  </div>
</template>

处理文件选择和上传逻辑:

<script>
export default {
  data() {
    return {
      selectedFile: null,
      progress: 0
    }
  },
  methods: {
    handleFileUpload(event) {
      this.selectedFile = event.target.files[0]
    },
    async uploadVideo() {
      if (!this.selectedFile) return

      const formData = new FormData()
      formData.append('video', this.selectedFile)

      try {
        const response = await axios.post('/api/upload', formData, {
          headers: {
            'Content-Type': 'multipart/form-data'
          },
          onUploadProgress: progressEvent => {
            this.progress = Math.round(
              (progressEvent.loaded * 100) / progressEvent.total
            )
          }
        })
        console.log('上传成功', response.data)
      } catch (error) {
        console.error('上传失败', error)
      }
    }
  }
}
</script>

后端API实现

Node.js Express示例:

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

const app = express()
const upload = multer({ 
  dest: 'uploads/',
  limits: {
    fileSize: 100 * 1024 * 1024 // 限制100MB
  }
})

app.post('/api/upload', upload.single('video'), (req, res) => {
  if (!req.file) {
    return res.status(400).send('没有上传文件')
  }

  // 这里可以添加文件验证逻辑
  const allowedTypes = ['video/mp4', 'video/webm']
  if (!allowedTypes.includes(req.file.mimetype)) {
    return res.status(400).send('不支持的文件类型')
  }

  res.json({
    message: '文件上传成功',
    filename: req.file.filename,
    path: req.file.path
  })
})

app.listen(3000, () => console.log('服务器启动'))

文件验证和限制

前端验证文件类型和大小:

handleFileUpload(event) {
  const file = event.target.files[0]
  const maxSize = 100 * 1024 * 1024 // 100MB

  if (!file.type.includes('video/')) {
    alert('请选择视频文件')
    return
  }

  if (file.size > maxSize) {
    alert('文件太大,最大支持100MB')
    return
  }

  this.selectedFile = file
}

进度显示优化

使用进度条组件增强用户体验:

<progress :value="progress" max="100"></progress>
<span v-if="progress > 0 && progress < 100">{{progress}}%</span>
<span v-else-if="progress === 100">上传完成!</span>

断点续传实现

对于大文件上传,实现分片上传:

async uploadLargeVideo() {
  const chunkSize = 5 * 1024 * 1024 // 5MB每片
  const chunks = Math.ceil(this.selectedFile.size / chunkSize)

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

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

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

    this.progress = Math.round(((i + 1) / chunks) * 100)
  }

  await axios.post('/api/merge-chunks', {
    filename: this.selectedFile.name,
    totalChunks: chunks
  })
}

视频预览功能

上传前预览视频:

<video v-if="videoUrl" :src="videoUrl" controls width="300"></video>
handleFileUpload(event) {
  const file = event.target.files[0]
  this.selectedFile = file
  this.videoUrl = URL.createObjectURL(file)
}

错误处理和重试机制

添加错误处理和自动重试:

async uploadWithRetry(formData, retries = 3) {
  try {
    return await axios.post('/api/upload', formData, {
      headers: {'Content-Type': 'multipart/form-data'}
    })
  } catch (error) {
    if (retries > 0) {
      return this.uploadWithRetry(formData, retries - 1)
    }
    throw error
  }
}

文件大小转换

格式化显示文件大小:

formatFileSize(bytes) {
  if (bytes === 0) return '0 Bytes'
  const k = 1024
  const sizes = ['Bytes', 'KB', 'MB', 'GB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

上传限制提示

显示上传限制信息:

<p>支持格式: MP4, WebM</p>
<p>最大文件大小: {{formatFileSize(100 * 1024 * 1024)}}</p>

这些方法提供了完整的视频上传解决方案,可以根据实际需求进行调整和扩展。

vue 实现视频上传

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

相关文章

jquery上传

jquery上传

jQuery 文件上传的实现方法 jQuery 可以通过多种方式实现文件上传功能,以下介绍几种常见的方法: 使用原生表单和 AJAX 通过 HTML 表单结合 jQuery 的 AJAX 功能实现文…

uniapp视频

uniapp视频

uniapp视频开发基础 uniapp支持通过video组件实现视频播放功能,该组件兼容多端(H5、小程序、App等),基本用法如下: <template> <video…

vue实现分段上传

vue实现分段上传

实现分段上传的基本思路 分段上传(分片上传)是将大文件分割成多个小块分别上传,最后在服务器合并的技术。这种方式能提高上传稳定性、支持断点续传,并减轻服务器压力。 前端实现步骤 安装依赖 需要axio…

jquery 视频

jquery 视频

使用 jQuery 播放视频 jQuery 可以简化 HTML5 视频的控制。通过 video 元素的 DOM 操作,可以实现播放、暂停等功能。 // 播放视频 $("#myVideo").trig…

h5实现抖音刷视频

h5实现抖音刷视频

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

vue实现上传头像

vue实现上传头像

使用 Vue 实现上传头像 前端实现 创建一个文件上传组件,使用 <input type="file"> 元素选择文件,并通过 FileReader 预览图片。 <templat…