实现基础上传 在 Vue 中可以通过原生 结合 FileReader 或 FormData…">
当前位置:首页 > VUE

vue实现上传视频

2026-02-17 14:57:52VUE

使用 <input type="file"> 实现基础上传

在 Vue 中可以通过原生 <input type="file"> 结合 FileReaderFormData 实现视频上传。创建一个文件选择按钮并监听 change 事件:

<template>
  <div>
    <input type="file" accept="video/*" @change="handleFileUpload" />
    <button @click="uploadVideo">上传</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedFile: null,
    };
  },
  methods: {
    handleFileUpload(event) {
      this.selectedFile = event.target.files[0];
    },
    uploadVideo() {
      if (!this.selectedFile) return;
      const formData = new FormData();
      formData.append('video', this.selectedFile);
      // 使用 axios 或其他 HTTP 库发送请求
      axios.post('/api/upload', formData, {
        headers: { 'Content-Type': 'multipart/form-data' },
      });
    },
  },
};
</script>

使用第三方库(如 vue-dropzone

对于更复杂的需求(如拖拽上传、预览等),可以使用第三方库如 vue-dropzone

  1. 安装依赖:
    npm install vue2-dropzone
  2. 在组件中配置:
    
    <template>
    <vue-dropzone
     ref="myVueDropzone"
     id="dropzone"
     :options="dropzoneOptions"
     @vdropzone-success="uploadSuccess"
    />
    </template>
import vue2Dropzone from 'vue2-dropzone'; import 'vue2-dropzone/dist/vue2Dropzone.min.css';

export default { components: { vueDropzone: vue2Dropzone }, data() { return { dropzoneOptions: { url: '/api/upload', acceptedFiles: 'video/*', maxFilesize: 500, // MB addRemoveLinks: true, }, }; }, methods: { uploadSuccess(file, response) { console.log('上传成功', response); }, }, };

```

分片上传与进度显示

大视频文件建议分片上传,结合 axiosonUploadProgress 实现进度条:

<template>
  <input type="file" @change="handleFileUpload" />
  <progress :value="uploadProgress" max="100"></progress>
</template>

<script>
export default {
  data() {
    return {
      uploadProgress: 0,
    };
  },
  methods: {
    async uploadVideo() {
      const chunkSize = 5 * 1024 * 1024; // 5MB 分片
      const chunks = Math.ceil(this.selectedFile.size / chunkSize);
      for (let i = 0; i < chunks; i++) {
        const chunk = this.selectedFile.slice(
          i * chunkSize,
          (i + 1) * chunkSize
        );
        const formData = new FormData();
        formData.append('chunk', chunk);
        formData.append('chunkIndex', i);
        await axios.post('/api/upload-chunk', formData, {
          onUploadProgress: (progressEvent) => {
            this.uploadProgress = Math.round(
              (progressEvent.loaded / progressEvent.total) * 100
            );
          },
        });
      }
    },
  },
};
</script>

视频预览与格式验证

在上传前验证文件类型并生成预览:

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

<script>
export default {
  data() {
    return {
      videoUrl: '',
    };
  },
  methods: {
    handleFileUpload(event) {
      const file = event.target.files[0];
      if (!file.type.includes('video/')) {
        alert('请上传视频文件!');
        return;
      }
      this.videoUrl = URL.createObjectURL(file);
    },
  },
};
</script>

后端接口注意事项

确保后端接口支持:

vue实现上传视频

  • multipart/form-data 格式接收文件。
  • 处理分片上传时合并文件。
  • 设置合理的文件大小限制(如 Nginx 的 client_max_body_size)。

通过以上方法,可以灵活实现 Vue 中的视频上传功能,覆盖从基础到高级的需求场景。

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

相关文章

h5实现实时视频通话

h5实现实时视频通话

实现H5实时视频通话的技术方案 WebRTC是实现H5实时视频通话的核心技术,无需插件即可在浏览器中实现点对点通信。以下是关键实现步骤: 基础环境准备 确保使用支持WebRTC的现代浏览器(Chro…

vue实现视频下滑

vue实现视频下滑

Vue 实现视频下滑功能 实现视频下滑功能通常涉及监听滚动事件、动态加载视频内容以及优化性能。以下是具体实现方法: 监听滚动事件 在 Vue 中可以通过 @scroll 事件监听滚动行为,结合 sc…

js实现文件的上传

js实现文件的上传

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。HTML部分需要包含一个文件选择控件和一个提交按…

vue实现直播视频

vue实现直播视频

Vue 实现直播视频的技术方案 方案一:基于 H5 的 video 标签与 MSE(Media Source Extensions) 使用 H5 的 <video> 标签结合 MSE 技…

vue实现切片上传

vue实现切片上传

切片上传的实现原理 切片上传是将大文件分割成多个小块(切片)分别上传,最后在服务端合并。这种方式能提高上传效率、支持断点续传和并发上传。 前端实现步骤 使用Vue实现切片上传需要借助File对象的s…

vue实现视频列表

vue实现视频列表

Vue 实现视频列表 在 Vue 中实现视频列表通常需要结合数据绑定、组件化和第三方库(如视频播放器)。以下是具体实现方法: 数据准备 创建一个数组存储视频信息,包括标题、封面图、视频链接等: d…