当前位置:首页 > VUE

vue 实现视频上传

2026-03-10 07:42:38VUE

实现视频上传的基本步骤

安装必要的依赖库,如axios用于文件上传,vue-video-player用于视频预览(可选)。

npm install axios vue-video-player

创建上传组件

在Vue组件中创建文件输入元素,绑定change事件处理文件选择。

<template>
  <div>
    <input type="file" accept="video/*" @change="handleFileChange" />
    <button @click="uploadVideo">上传视频</button>
    <video v-if="videoUrl" :src="videoUrl" controls></video>
  </div>
</template>

处理文件选择和上传

methods中实现文件处理和上传逻辑,使用FormData对象包装文件数据。

<script>
import axios from 'axios';

export default {
  data() {
    return {
      selectedFile: null,
      videoUrl: ''
    };
  },
  methods: {
    handleFileChange(event) {
      this.selectedFile = event.target.files[0];
      this.videoUrl = URL.createObjectURL(this.selectedFile);
    },
    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'
          }
        });
        console.log('上传成功:', response.data);
      } catch (error) {
        console.error('上传失败:', error);
      }
    }
  }
};
</script>

服务器端处理

创建简单的Node.js Express服务器处理上传请求,使用multer中间件处理文件上传。

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('服务器运行在端口3000');
});

进度显示和限制

添加上传进度显示和文件大小限制,提升用户体验。

methods: {
  async uploadVideo() {
    if (!this.selectedFile) return;

    // 文件大小限制(50MB)
    const maxSize = 50 * 1024 * 1024;
    if (this.selectedFile.size > maxSize) {
      alert('文件大小超过50MB限制');
      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 => {
          const percentCompleted = Math.round(
            (progressEvent.loaded * 100) / progressEvent.total
          );
          console.log(`上传进度: ${percentCompleted}%`);
        }
      });
      console.log('上传成功:', response.data);
    } catch (error) {
      console.error('上传失败:', error);
    }
  }
}

视频预览优化

使用vue-video-player提供更好的视频预览体验。

vue 实现视频上传

import { videoPlayer } from 'vue-video-player';

export default {
  components: {
    videoPlayer
  },
  data() {
    return {
      playerOptions: {
        autoplay: false,
        controls: true,
        sources: []
      }
    };
  },
  methods: {
    handleFileChange(event) {
      this.selectedFile = event.target.files[0];
      this.playerOptions.sources = [{
        type: this.selectedFile.type,
        src: URL.createObjectURL(this.selectedFile)
      }];
    }
  }
};
<template>
  <div>
    <input type="file" accept="video/*" @change="handleFileChange" />
    <video-player :options="playerOptions"></video-player>
    <button @click="uploadVideo">上传视频</button>
  </div>
</template>

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

相关文章

Vue实现视频截图

Vue实现视频截图

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

vue项目实现视频

vue项目实现视频

视频播放基础实现 在Vue项目中实现视频播放,可以使用HTML5的<video>标签。以下是一个基础示例: <template> <div> &l…

vue实现上传按钮

vue实现上传按钮

Vue 实现上传按钮的方法 使用原生 HTML input 和 Vue 处理 通过 HTML 的 input 元素结合 Vue 的事件处理实现文件上传功能。 <template> &…

vue实现录视频

vue实现录视频

Vue 实现录视频功能 使用浏览器 API 实现录屏 在 Vue 项目中可以通过浏览器提供的 MediaDevices API 和 MediaRecorder API 实现录屏功能。需要确保浏览器支持…

vue实现视频倒放

vue实现视频倒放

实现视频倒放的方法 在Vue中实现视频倒放可以通过多种方式完成,以下是几种常见的方法: 使用HTML5 Video API和Canvas 通过HTML5 Video API和Canvas可以实现视频…

vue实现监控视频流

vue实现监控视频流

Vue 中实现监控视频流的方法 使用 HTML5 的 <video> 标签 在 Vue 组件中,可以通过 HTML5 的 <video> 标签来播放视频流。适用于支持 RTMP…