当前位置:首页 > 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 实现视频播放功能 使用 Vue 实现视频播放功能可以通过 HTML5 的 <video> 标签或第三方库(如 video.js)来实现。以下是两种常见的方法: 使用 HTML5…

css飞机制作视频

css飞机制作视频

使用CSS制作飞机动画 通过CSS的动画和变形属性,可以创建一个简单的飞机动画效果。以下是实现步骤: HTML结构 <div class="airplane"></div&g…

vue实现分片播放视频

vue实现分片播放视频

实现分片播放视频的基本思路 分片播放视频的核心是将视频文件分割为多个片段,按需加载和播放。Vue中可通过HTML5的<video>标签结合自定义逻辑实现。 视频分片处理 视频文件…

elementui视频

elementui视频

以下是关于 ElementUI 视频资源的整理,涵盖教程、实战案例和官方资源: ElementUI 官方视频资源 ElementUI 官方文档虽以文字为主,但部分社区或第三方平台可能有官方团队发布的…

h5实现视频

h5实现视频

使用HTML5实现视频播放 HTML5提供了内置的<video>标签,可以直接在网页中嵌入视频内容,无需依赖第三方插件如Flash。以下是实现方法和相关细节: 基本语法 <v…

h5实现视频直播

h5实现视频直播

实现H5视频直播的基本方法 使用HTML5的<video>标签结合直播流协议(如HLS或DASH)是实现视频直播的常见方式。现代浏览器已普遍支持这些技术。 选择直播流协议 HLS(HT…