结合 FormData 实现视频上传功能。
当前位置:首页 > VUE

vue 实现上传视频

2026-02-17 21:03:02VUE

Vue 实现上传视频的方法

使用原生 HTML5 文件上传

在 Vue 中可以通过 <input type="file"> 结合 FormData 实现视频上传功能。

<template>
  <div>
    <input type="file" accept="video/*" @change="handleFileUpload" />
    <button @click="uploadVideo">上传视频</button>
  </div>
</template>

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

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

      axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(response => {
        console.log('上传成功', response.data)
      }).catch(error => {
        console.error('上传失败', error)
      })
    }
  }
}
</script>

使用第三方组件库

Element UI 或 Ant Design Vue 等组件库提供了现成的上传组件。

<template>
  <el-upload
    action="/api/upload"
    :before-upload="beforeUpload"
    :on-success="handleSuccess"
    :on-error="handleError"
    accept="video/*"
  >
    <el-button type="primary">点击上传</el-button>
  </el-upload>
</template>

<script>
export default {
  methods: {
    beforeUpload(file) {
      const isVideo = file.type.includes('video/')
      if (!isVideo) {
        this.$message.error('只能上传视频文件')
        return false
      }
      return true
    },
    handleSuccess(response) {
      console.log('上传成功', response)
    },
    handleError(error) {
      console.error('上传失败', error)
    }
  }
}
</script>

显示上传进度

可以添加进度条显示上传进度。

<template>
  <div>
    <input type="file" @change="handleFileUpload" />
    <button @click="uploadVideo">上传</button>
    <progress :value="uploadProgress" max="100"></progress>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedFile: null,
      uploadProgress: 0
    }
  },
  methods: {
    uploadVideo() {
      const config = {
        onUploadProgress: progressEvent => {
          this.uploadProgress = Math.round(
            (progressEvent.loaded * 100) / progressEvent.total
          )
        }
      }

      axios.post('/api/upload', formData, config)
    }
  }
}
</script>

文件大小限制

在上传前检查文件大小。

methods: {
  beforeUpload(file) {
    const maxSize = 100 * 1024 * 1024 // 100MB
    if (file.size > maxSize) {
      this.$message.error('视频大小不能超过100MB')
      return false
    }
    return true
  }
}

视频预览功能

上传前可以预览视频内容。

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

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

分片上传大文件

对于大文件可以使用分片上传。

vue 实现上传视频

async function chunkUpload(file) {
  const chunkSize = 5 * 1024 * 1024 // 5MB
  const chunks = Math.ceil(file.size / chunkSize)

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

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

    await axios.post('/api/upload-chunk', formData)
  }

  await axios.post('/api/merge-chunks', {
    fileName: file.name,
    totalChunks: chunks
  })
}

以上方法涵盖了从基础上传到高级功能的实现,可以根据项目需求选择合适的方式。

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

相关文章

css帧动画制作视频

css帧动画制作视频

使用CSS关键帧(@keyframes)制作动画 定义关键帧动画,通过@keyframes规则指定动画在不同时间点的样式变化。例如创建一个元素从左到右移动的动画: @keyframes slide…

h5实现视频通话

h5实现视频通话

WebRTC 基础实现 H5 视频通话主要通过 WebRTC(Web Real-Time Communication)技术实现。现代浏览器原生支持该 API,无需插件即可完成点对点音视频传输。 安装…

vue实现播放视频

vue实现播放视频

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

vue实现语音上传

vue实现语音上传

实现语音上传功能 在Vue中实现语音上传功能需要结合浏览器的Web Audio API和文件上传逻辑。以下是一个完整的实现方案: 录音功能实现 安装依赖库recorder-core和wav编码器:…

vue实现短视频

vue实现短视频

Vue 实现短视频功能 在 Vue 中实现短视频功能通常涉及视频播放、列表展示、交互控制等模块。以下是关键实现方法: 视频播放组件 使用 <video> 标签或第三方库(如 vue-vi…

vue实现附件上传

vue实现附件上传

文件上传的基本实现 在Vue中实现文件上传可以通过原生HTML的<input type="file">元素结合Vue的数据绑定和事件处理来完成。创建一个文件上传组件,监听change事件获…