Vue上传视频

一、Vue上传视频文件

Vue上传视频文件是前端开发中非常重要的一环,该环节主要负责将视频文件上传至服务器。前端上传一般分为两步:1)获取视频文件2)上传文件。Vue框架最常见的形式是使用第三方插件vue-upload-component。

1.获取视频文件

获取视频文件可以使用input[type=”file”]标签,但是该标签每次传输的文件大小有限制,还需要在每个上传按钮上重新设置。可以选择使用封装好的Vue组件,例如vue-upload-component,使用该组件可以让文件上传变得更容易。

<template>
   <VueUploadComponent 
      class="video-upload"
      extensions="mp4,mov" 
      :chunk-size="1024*1024+100"
      :multiple="true" 
      @input-file="onInputFile" 
      @on-start="onStart"
   >
     <div class="dropzone">拖放视频文件或者点击这里</div>
   </VueUploadComponent>
</template>

<script>
import VueUploadComponent from 'vue-upload-component';

export default {
  components: {VueUploadComponent},
  methods: {
    onStart () {
      console.log('Started...');
    },
    onInputFile (event) {
      console.log(event);
    }
  }
};
</script>

2.上传视频文件

上传文件一般使用FormData来封装表单数据以及文件。Vue中可以使用axios或者Vue-resource等http库来发送请求,并且封装好了上传文件所需的FormData。我们只需在Vue组件中绑定事件监听器并使用http库上传文件即可。

<template>
  <div>
    <input type="file" @change="uploadVideo" accept="video/*" />
  </div>
</template>

<script>
export default {
  methods: {
    uploadVideo (event) {
      const formData = new FormData();
      formData.append('video', event.target.files[0]);
      axios.post('/api/video', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(response => {
        console.log('Video uploaded!');
      });
    }
  }
};
</script>

二、Vue上传图片和视频

在Vue中同时上传图片和视频有两种方法:1)使用Vue-upload-component;2)使用HTML5多文件上传功能。

1.使用Vue-upload-component上传图片和视频

使用Vue-upload-component可以同时上传图片和视频,只需指定允许上传的文件类型,即可完成上传操作。

<template>
  <div>
    <VueUploadComponent :accept="'image/*, video/*'" id="file" :max-size="10 * 1024 * 1024" @input-file="onInputFile" />
  </div>
</template>

<script>
import VueUploadComponent from 'vue-upload-component';

export default {
  components: {VueUploadComponent},
  methods: {
    onInputFile () {
      console.log('File input!');
    }
  }
};
</script>

2.使用HTML5多文件上传功能

HTML5多文件上传功能可以将多个文件传输至服务器,但需要手动建立文件输入框并监听文件选择事件。

<template>
  <div>
    <input type="file" multiple="multiple" @change="uploadFiles" accept="image/*, video/*" />
  </div>
</template>

<script>
export default {
  methods: {
    uploadFiles (event) {
      const formData = new FormData();
      const files = event.target.files;
      for (let i = 0; i < files.length; i++) {
        formData.append(`file${i}`, files[i]);
      }
      axios.post('/api/upload', formData, {
        headers: {
          'content-type': 'multipart/form-data'
        }
      }).then(response => {
        console.log('Files uploaded!');
      });
    }
  }
};
</script>

三、Vue上传视频回显

Vue上传视频回显主要是将已上传的视频显示在页面上。视频回显有两种形式:1)预览图+链接下载;2)直接播放视频。

1.预览图+链接下载

预览图+链接下载是将上传的视频转换为预览图和下载链接的形式,直接点击预览图即可下载视频。预览图一般是视频的第一帧截图。

<template>
  <div v-for="video in videos">
    <img :src="video.cover" alt="video cover" />
    <a :href="downloadVideo(video.url)" download>Download</a>
  </div>
</template>

<script>
export default {
  methods: {
    downloadVideo (url) {
      return url.replace('videos/', 'download/');
    }
  }
};
</script>

2.直接播放视频

直接播放视频是在页面上直接显示上传的视频,使用HTML5 video标签即可实现。该方式比预览图+链接下载行为直观。

<template>
  <div v-for="video in videos">
    <video :src="video.url" controls></video>
  </div>
</template>

四、Vue上传视频和后台交互

上传视频到服务器时,需要和后台进行交互,将数据和文件传输给服务器。常用的方式有两种:1)前后端分离;2)后端封装。

1.前后端分离

前后端分离是将前端和后台分别进行开发,两者使用API进行交互。前端主要负责文件上传和接收与后台的交互数据来更新UI页面。后台负责接收文件和数据,进行文件存储和其他逻辑处理。

前端代码
<template>
  <div>
    <input type="file" @change="uploadVideo" accept="video/*" />
  </div>
</template>

<script>
export default {
  methods: {
    uploadVideo (event) {
      const formData = new FormData();
      formData.append('video', event.target.files[0]);
      axios.post('/api/video', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(response => {
        console.log('Video uploaded!');
      });
    }
  }
};
</script>
后端代码
const express = require('express');
const multer  = require('multer');
const path = require('path');

const app = express();

const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/videos');
  },
  filename: (req, file, cb) => {
    cb(null, file.originalname);
  }
});

const upload = multer({ storage });

app.post('/api/video', upload.single('video'), (req, res) => {
  console.log('Video uploaded!');
  res.send();
});

app.listen(3000, () => {
  console.log('Server started!');
});

2.后端封装

后端封装是后台对上传文件进行封装,前端只需要调用对应的API即可完成文件上传和交互互动。该方式开发难度小,适用于小型应用。

<template>
  <div>
    <input type="file" @change="uploadVideo" accept="video/*" />
  </div>
</template>

<script>
export default {
  methods: {
    uploadVideo (event) {
      const formData = new FormData();
      formData.append('video', event.target.files[0]);
      axios.post('/api/video', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(response => {
        console.log('Video uploaded!');
      });
    }
  }
};
</script>

五、Vue上传视频获取视频信息

上传视频后,我们需要获取视频信息来进行后续操作。获取视频信息有两种方法:1)使用FFmpeg;2)使用浏览器原生API。

1.使用FFmpeg获取视频信息

FFmpeg是一个开源的视频处理工具,可以运行在各种操作系统上。使用Vue结合FFmpeg,可以直接在前端实现对上传视频的格式转换、视频截图等操作,但需要用户的浏览器支持WebAssembly。

<template>
  <div>
    <input type="file" ref="fileInput" @change="getVideoInfo" accept="video/*" />
  </div>
</template>

<script>
export default {
  methods: {
    getVideoInfo () {
      if (!this.$refs.fileInput.files.length) return;
      const file = this.$refs.fileInput.files[0];
      const ffm = createFFmpeg({
        log: true,
        progress: p => console.log(p)
      });

      ffm.load().then(() => {
        ffm.FS('writeFile', 'video.mp4', new Uint8Array(await response.arrayBuffer()));
        ffm.run('-i', 'video.mp4');
        const stdout = ffm.FS('readFile', 'stdout').toString();
        console.log(stdout);
      });
    }
  }
};
</script>

2.使用浏览器原生API获取视频信息

使用浏览器原生API可以获取视频的一些基本信息,例如视频截图、时长、大小等。

<template>
  <div>
    <input type="file" ref="fileInput" @change="getVideoInfo" accept="video/*" />
  </div>
</template>

<script>
export default {
  methods: {
    getVideoInfo () {
      if (!this.$refs.fileInput.files.length) return;
      const file = this.$refs.fileInput.files[0];
      const reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onloadend = () => {
        const video = document.createElement('video');
        video.setAttribute('src', reader.result);
        video.load();
        video.onloadedmetadata = () => {
          console.log('Video duration:', video.duration);
          console.log('Video width:', video.videoWidth);
          console.log('Video height:', video.videoHeight);
        };
      };
    }
  }
};
</script>

六、Vue上传视频文件组件

为了方便重用,可以将Vue上传视频的相关代码封装为一个组件。组件的作用是将上传文件的过程封装起来,避免重复代码和页面实现的重复。

<template>
  <div>
    <input type="file" ref="fileInput" @input="onInputFile" accept="video/*" />
    <button @click="uploadVideo">Upload</button>
  </div>
</template>

<script>
export default {
  props: {
    url: {
      type: String,
      required: true
    }
  },
  data () {
    return {
      file: null
    };
  },
  methods: {
    onInputFile (event) {
      this.file = event.target.files[0];
    },
    uploadVideo () {
      if (!this.file) return;
      const formData = new FormData();
      formData.append('video', this.file);
      axios.post(this.url, formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(response => {
        console.log('Video uploaded!');
      });
    }
  }
};
</script>

七、Vue上传视频,获取时长

获取视频时长可以使用ffmpeg或者HTML5提供的duration属性。

1.使用FFmpeg获取时长

<script>
export default {
methods: {
async getVideoDuration () {
const fileInput = this.$refs

原创文章,作者:XZSU,如若转载,请注明出处:https://www.506064.com/n/147513.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
XZSUXZSU
上一篇 2024-11-01 14:09
下一篇 2024-11-01 14:09

相关推荐

  • 使用Vue实现前端AES加密并输出为十六进制的方法

    在前端开发中,数据传输的安全性问题十分重要,其中一种保护数据安全的方式是加密。本文将会介绍如何使用Vue框架实现前端AES加密并将加密结果输出为十六进制。 一、AES加密介绍 AE…

    编程 2025-04-29
  • Vue TS工程结构用法介绍

    在本篇文章中,我们将从多个方面对Vue TS工程结构进行详细的阐述,涵盖文件结构、路由配置、组件间通讯、状态管理等内容,并给出对应的代码示例。 一、文件结构 一个好的文件结构可以极…

    编程 2025-04-29
  • 百度网盘Python上传

    百度网盘是一个常用的云存储平台,提供了多种上传文件的方式,其中包括使用Python进行上传。本文将从安装Python、安装依赖库、上传文件三个方面进行详细阐述。 一、安装Pytho…

    编程 2025-04-28
  • 如何使用git拉出某个用户上传的文件?

    Git是一个非常流行的版本控制系统,它可以帮助团队协作,并保证代码的版本控制。有时候,我们需要拉出某个用户上传的文件,但不知道从哪里开始。本文将会从多个方面详细阐述如何使用git拉…

    编程 2025-04-28
  • 上传多媒体文件的常用方法——uploadmediabyurl

    uploadmediabyurl是一个非常常用的方法,它允许我们将本地的多媒体文件上传到微信服务器上。 一、uploadmediabyurl的基本使用方法 要使用uploadmed…

    编程 2025-04-27
  • Vue3的vue-resource使用教程

    本文将从以下几个方面详细阐述Vue3如何使用vue-resource。 一、安装Vue3和vue-resource 在使用vue-resource前,我们需要先安装Vue3和vue…

    编程 2025-04-27
  • NB设备上传数据方案

    NB(Narrow Band)是一种物联网通信技术,可以实现低功耗、宽覆盖、多连接等特点。本文旨在探讨如何使用NB设备上传数据。在这篇文章中,我们将介绍NB设备上传数据的基本原理、…

    编程 2025-04-27
  • Vue模拟按键按下

    本文将从以下几个方面对Vue模拟按键按下进行详细阐述: 一、Vue 模拟按键按下的场景 在前端开发中,我们常常需要模拟按键按下的场景,比如在表单中填写内容后,按下“回车键”提交表单…

    编程 2025-04-27
  • ThinkPHP6 + Vue.js: 不使用Fetch的数据请求方法

    本文将介绍如何在ThinkPHP6和Vue.js中进行数据请求,同时避免使用Fetch函数。 一、AJAX:XMLHttpRequest的基础使用 在进行数据请求时,最基础的方式就…

    编程 2025-04-27
  • 开发前端程序,Vue是否足够?

    Vue是一个轻量级,高效,渐进式的JavaScript框架,用于构建Web界面。开发人员可以使用Vue轻松完成前端编程,开发响应式应用程序。然而,当涉及到需要更大的生态系统,或利用…

    编程 2025-04-27

发表回复

登录后才能评论