实现基础上传 在 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 中的视频上传功能,覆盖从基础到高级的需求场景。

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

相关文章

vue实现树形视频

vue实现树形视频

Vue 实现树形视频列表 在 Vue 中实现树形视频列表可以通过递归组件和嵌套数据结构来完成。以下是具体实现方法: 数据结构设计 使用嵌套数组表示视频分类和子视频,每个节点包含 id、name、ch…

vue实现上传进度

vue实现上传进度

Vue 实现文件上传进度 在 Vue 中实现文件上传进度可以通过 XMLHttpRequest 或 axios 的 onUploadProgress 事件来监听上传进度。以下是两种常见实现方式: 使…

vue实现视频id

vue实现视频id

Vue 中实现视频 ID 管理 在 Vue 中管理视频 ID 通常涉及动态绑定、状态管理和 API 交互。以下是几种常见场景的实现方法: 动态绑定视频 ID 到播放器 通过 v-bind 或 :sr…

vue视频列表实现

vue视频列表实现

Vue 视频列表实现 数据准备 定义一个数组存储视频信息,每个视频对象包含标题、封面图、播放地址等属性。 data() { return { videos: [ {…

vue实现附件上传

vue实现附件上传

文件上传的基本实现 在Vue中实现文件上传可以通过原生HTML的<input type="file">元素结合Vue的数据绑定和事件处理来完成。创建一个文件上传组件,监听change事件获…

vue实现视频功能

vue实现视频功能

Vue 实现视频播放功能 使用 Vue 实现视频功能可以通过原生 HTML5 <video> 标签或第三方库(如 video.js)来实现。以下是两种常见方法: 使用原生 HTML5 &…