一、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
微信扫一扫
支付宝扫一扫