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/zh-hk/n/147513.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
XZSU的頭像XZSU
上一篇 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

發表回復

登錄後才能評論