当前位置:首页 > 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 中可以通过 @scroll 事件监听滚动行为,结合 sc…

vue实现短视频

vue实现短视频

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

vue实现视频上传

vue实现视频上传

Vue 实现视频上传的方法 使用原生 input 元素和 FormData 在 Vue 中可以通过原生 input 元素结合 FormData 实现视频上传功能。创建一个文件选择输入框,监听文件变化事…

vue实现录视频

vue实现录视频

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

vue实现图片重新上传

vue实现图片重新上传

实现图片重新上传功能 在Vue中实现图片重新上传功能,通常涉及文件选择、预览、上传和重置等步骤。以下是一个完整的实现方案: 模板部分 <template> <div>…

vue实现图片压缩上传

vue实现图片压缩上传

实现图片压缩上传的方法 使用HTML5的Canvas进行压缩 通过Canvas的drawImage和toDataURL方法实现图片压缩。创建一个input元素用于选择图片,监听change事件处理压缩…