当前位置:首页 > VUE

vue上传视频实现

2026-01-08 05:46:57VUE

Vue 实现视频上传功能

安装依赖

确保项目中已安装 axiosvue-upload-component 等上传库。通过 npm 安装:

npm install axios

前端组件实现

创建一个 Vue 组件用于视频上传,包含文件选择按钮和上传逻辑:

vue上传视频实现

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

<script>
import axios from 'axios';

export default {
  data() {
    return {
      selectedFile: null,
      progress: 0
    };
  },
  methods: {
    handleFileChange(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 / progressEvent.total) * 100
            );
          }
        });
        console.log('上传成功:', response.data);
      } catch (error) {
        console.error('上传失败:', error);
      }
    }
  }
};
</script>

后端接口处理

假设使用 Node.js + Express 作为后端,处理上传请求的示例:

const express = require('express');
const multer = require('multer');
const app = express();

const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/');
  },
  filename: (req, file, cb) => {
    cb(null, Date.now() + '-' + file.originalname);
  }
});

const upload = multer({ storage });

app.post('/api/upload', upload.single('video'), (req, res) => {
  res.json({ message: '视频上传成功', file: req.file });
});

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

进度显示优化

通过 onUploadProgress 回调实时更新上传进度条:

vue上传视频实现

<progress :value="progress" max="100"></progress>

文件验证

在上传前验证文件类型和大小:

methods: {
  handleFileChange(event) {
    const file = event.target.files[0];
    if (!file.type.includes('video/')) {
      alert('请选择视频文件');
      return;
    }
    if (file.size > 100 * 1024 * 1024) { // 100MB限制
      alert('文件大小超过限制');
      return;
    }
    this.selectedFile = file;
  }
}

分块上传(大文件)

对于大视频文件,可采用分块上传策略:

async uploadChunks(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(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('fileName', file.name);

    await axios.post('/api/upload-chunk', formData);
    this.progress = Math.round((i + 1) / chunks * 100);
  }
}

注意事项

  • 后端需配置足够的请求体大小限制(如 Express 使用 body-parser
  • 生产环境应添加用户认证和文件权限控制
  • 考虑使用云存储服务(如 AWS S3、阿里云 OSS)替代本地存储

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

相关文章

vue实现分片播放视频

vue实现分片播放视频

Vue实现分片播放视频的方法 分片播放视频通常用于优化大视频文件的加载和播放体验,以下是实现方法: 使用HTML5 Video标签结合Vue HTML5的<video>标签支持Media…

vue实现上传

vue实现上传

Vue 文件上传实现方法 使用 Vue 实现文件上传可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的事件处理和数据绑定来实现。 基础实现步骤…

vue实现上传表哥

vue实现上传表哥

Vue 实现上传表格 在 Vue 中实现上传表格功能,通常涉及文件上传、文件解析(如 Excel 或 CSV)以及数据展示。以下是具体实现方法: 使用 Element UI 上传组件 Elemen…

vue实现头像上传

vue实现头像上传

实现头像上传功能 在Vue中实现头像上传功能通常需要结合文件上传组件和后端接口处理。以下是具体实现步骤: 前端组件实现 创建文件上传组件模板部分: <template> <d…

css帧动画制作视频

css帧动画制作视频

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