当前位置:首页 > VUE

vue上传视频实现

2026-02-10 20:22:56VUE

Vue 上传视频实现

在 Vue 中实现视频上传功能,可以通过以下方法完成。以下步骤涵盖了从文件选择到上传至服务器的完整流程。

文件选择与预览

使用 <input type="file"> 结合 Vue 的 v-model 或事件监听实现文件选择。通过 URL.createObjectURL 生成预览链接。

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

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

文件上传

通过 FormData 对象将文件发送至服务器。使用 axios 或其他 HTTP 库实现上传。

methods: {
  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('Upload success:', response.data);
    } catch (error) {
      console.error('Upload failed:', error);
    }
  }
}

进度显示

通过 axiosonUploadProgress 回调实现上传进度监控。

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('Upload progress:', percentCompleted + '%');
  }
});

文件校验

在上传前校验文件类型和大小。

handleFileChange(event) {
  const file = event.target.files[0];
  if (!file) return;

  const validTypes = ['video/mp4', 'video/webm'];
  const maxSize = 100 * 1024 * 1024; // 100MB

  if (!validTypes.includes(file.type)) {
    alert('Please select a valid video file (MP4 or WebM).');
    return;
  }

  if (file.size > maxSize) {
    alert('File size exceeds 100MB limit.');
    return;
  }

  this.selectedFile = file;
  this.videoUrl = URL.createObjectURL(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);
  }
}

后端配合示例(Node.js)

以下是一个简单的 Node.js Express 后端接收代码示例。

vue上传视频实现

const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'uploads/' });

app.post('/api/upload', upload.single('video'), (req, res) => {
  console.log('File uploaded:', req.file);
  res.json({ message: 'Upload successful' });
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

注意事项

  • 跨域问题:确保后端配置了 CORS 头。
  • 安全性:后端需校验文件类型和内容,避免恶意上传。
  • 存储:考虑使用云存储(如 AWS S3、阿里云 OSS)处理大文件。
  • 断点续传:可通过记录已上传分片实现。

以上方法可根据实际需求调整,例如添加拖拽上传、多文件上传等扩展功能。

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

相关文章

vue实现上传

vue实现上传

Vue 实现文件上传 在 Vue 中实现文件上传功能可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的数据绑定和事件处理来实现。以下是几种常见的实现…

vue实现上传头像

vue实现上传头像

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

vue实现缓存视频

vue实现缓存视频

Vue 实现视频缓存的方法 在 Vue 中实现视频缓存可以通过多种方式完成,包括使用浏览器的缓存机制、Service Worker 或者借助第三方库。以下是几种常见的方法: 使用 Service W…

vue实现视频录制

vue实现视频录制

实现视频录制的基本思路 在Vue中实现视频录制通常需要借助浏览器的MediaDevices API和MediaRecorder API。核心流程包括获取用户摄像头/麦克风权限、录制媒体流、保存录制结果…

vue实现视频流

vue实现视频流

Vue实现视频流的方法 在Vue中实现视频流通常涉及HTML5的<video>标签、WebRTC或第三方库。以下是几种常见的方法: 使用HTML5 video标签 通过HTML5的<…

vue用户实现头像上传

vue用户实现头像上传

前端实现头像上传(Vue + Element UI) 环境准备 确保项目已安装element-ui和axios(或其他HTTP库): npm install element-ui axios 组件代…