vue实现视频上传功能

本文实例为大家分享了vue实现视频上传功能的具体代码,供大家参考,具体内容如下

环境:vue + TS 上传视频 + 上传到阿里云
主要处理前端在vue下上传视频

使用的是阿里云的视频点播服务

1、需要后台去申请一个开发API,请求阿里云的接口访问控制
2、有了开发视频的token,供给前端
3、前端去请求阿里云存储

video.vue

<template>
  <div class="container">
    <el-card>
      <div slot="header">
        <div>课程:</div>
        <div>阶段:</div>
        <div>课时:</div>
      </div>
      <el-form label-width="40px">
        <el-form-item label="视频">
          <input
            ref="video-file"
            type="file"
          >
        </el-form-item>
        <el-form-item label="封面">
          <input
            ref="image-file"
            type="file"
          />
        </el-form-item>
        <el-form-item>
          <el-button
            type="primary"
            @click="authUpload"
          >开始上传</el-button>
          <el-button>返回</el-button>
        </el-form-item>
      </el-form>
    </el-card>
  </div>
</template>
<script>
/* eslint-disable */
import axios from 'axios'
import {
  aliyunImagUploadAddressAdnAuth,
  aliyunVideoUploadAddressAdnAuth,
  transCodeVideo,
  getAliyunTransCodePercent
} from '@/services/aliyun-oss'

export default {
  data () {
    return {
      uploader: null,
      videoId: null,
      imageUrl: '',
      fileName: ''
    }
  },
  created () {
    this.initUploader()
  },
  methods: {
    authUpload () {
      const videoFile = this.$refs['video-file'].files[0]
      this.uploader.addFile(videoFile, null, null, null, '{"Vod":{}}')
      this.uploader.addFile(this.$refs['image-file'].files[0], null, null, null, '{"Vod":{}}')
      this.fileName = videoFile.name
      this.uploader.startUpload()
    },
    initUploader () {
      this.uploader = new window.AliyunUpload.Vod({
        // 阿里账号ID,必须有值 ,值的来源https://help.aliyun.com/knowledge_detail/37196.html
        userId: 1618139964448548,
        // 上传到点播的地域, 默认值为'cn-shanghai',//eu-central-1,ap-southeast-1
        region: 'cn-shanghai',
        // 分片大小默认1M,不能小于100K
        partSize: 1048576,
        // 并行上传分片个数,默认5
        parallel: 5,
        // 网络原因失败时,重新上传次数,默认为3
        retryCount: 3,
        // 网络原因失败时,重新上传间隔时间,默认为2秒
        retryDuration: 2,
        // 开始上传
        onUploadstarted: async uploadInfo => {
          console.log('onUploadstarted', uploadInfo)
          let uploadAuthInfo = null
          if (uploadInfo.isImage) {
            const { data } = await aliyunImagUploadAddressAdnAuth()
            this.imageUrl = data.data.imageURL
            uploadAuthInfo = data.data
          } else {
            const { data } = await aliyunVideoUploadAddressAdnAuth({
              fileName: uploadInfo.file.name
            })
            this.videoId = data.data.videoId
            uploadAuthInfo = data.data
          }
          
          // console.log('uploadAuthInfo', uploadAuthInfo)

          this.uploader.setUploadAuthAndAddress(
            uploadInfo,
            uploadAuthInfo.uploadAuth,
            uploadAuthInfo.uploadAddress,
            uploadAuthInfo.videoId || uploadAuthInfo.imageId
          )
        },
        // 文件上传成功
        onUploadSucceed: function (uploadInfo) {
          console.log('onUploadSucceed', uploadInfo)
        },
        // 文件上传失败
        onUploadFailed: function (uploadInfo, code, message) {
          console.log('onUploadFailed')
        },
        // 文件上传进度,单位:字节
        onUploadProgress: function (uploadInfo, totalSize, loadedPercent) {
        },
        // 上传凭证超时
        onUploadTokenExpired: function (uploadInfo) {
          console.log('onUploadTokenExpired')
        },
        // 全部文件上传结束
        onUploadEnd: async uploadInfo => {
          console.log(uploadInfo)
          console.log({
            lessonId: this.$route.query.lessonId,
            fileId: this.videoId,
            coverImageUrl: this.imageUrl,
            fileName: this.fileName
          })
          const { data } = await transCodeVideo({
            lessonId: this.$route.query.lessonId,
            fileId: this.videoId,
            coverImageUrl: this.imageUrl,
            fileName: this.fileName
          })
          console.log(data)

          setInterval(async () => {
             const { data } = await getAliyunTransCodePercent(this.$route.query.lessonId)
             console.log('转码进度', data)
          }, 3000)
        }
      })
    }
  }
}
</script>

aliyun-oss.ts ,存放接口

/**
 * 阿里云上传
 */

import request from '@/utils/request'

export const aliyunImagUploadAddressAdnAuth = () => {
  return request({
    method: 'GET',
    url: '/boss/course/upload/aliyunImagUploadAddressAdnAuth.json'
  })
}

export const aliyunVideoUploadAddressAdnAuth = (params: any) => {
  return request({
    method: 'GET',
    url: '/boss/course/upload/aliyunVideoUploadAddressAdnAuth.json',
    params
  })
}

export const transCodeVideo = (data: any) => {
  return request({
    method: 'POST',
    url: '/boss/course/upload/aliyunTransCode.json',
    data
  })
}

export const getAliyunTransCodePercent = (lessonId: string | number) => {
  return request({
    method: 'GET',
    url: '/boss/course/upload/aliyunTransCodePercent.json',
    params: {
      lessonId
    }
  })
}

以上就是本文的全部内容,希望对大家的学习有所帮助

参考文章:http://blog.ncmem.com/wordpress/2023/10/10/vue%e5%ae%9e%e7%8e%b0%e8%a7%86%e9%a2%91%e4%b8%8a%e4%bc%a0%e5%8a%9f%e8%83%bd/
欢迎入群一起讨论

在这里插入图片描述

### 如何使用 Spring Boot 和 Vue 实现视频上传与播放功能 #### 项目准备 为了实现视频上传和播放功能,在前端部分采用 `Vue` 框架配合 `vue-video-player` 插件,而后端则利用 `Spring Boot` 来处理文件存储逻辑以及提供API支持。 #### 后端 API 设计 在 `Spring Boot` 中定义用于接收客户端发送过来的视频文件的服务接口。通常情况下会涉及到两个主要的操作:一个是上传视频文件至服务器;另一个是从服务器获取已上传视频的信息以便于前端调用显示[^4]。 ```java @RestController @RequestMapping("/api/videos") public class VideoController { @PostMapping("/upload") public ResponseEntity<String> uploadVideo(@RequestParam("file") MultipartFile file){ try { // 处理文件保存业务... return new ResponseEntity<>("File uploaded successfully", HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.EXPECTATION_FAILED); } } @GetMapping("/{id}") public ResponseEntity<Resource> getVideoById(@PathVariable String id){ // 根据ID加载资源... return null; } } ``` #### 前端页面布局 对于 `Vue` 应用来说,则需要设置好表单用来提交视频文件给后端,并且当接收到响应之后能够及时更新视图中的数据列表。同时还要引入 `vue-video-player` 组件来负责实际的媒体流解析工作[^1]。 ```html <template> <div> <!-- 文件选择器 --> <input type="file" accept="video/*" v-on:change="handleFileChange"/> <!-- 提交按钮触发上传动作 --> <button @click="submitUpload">上传</button> <!-- 显示所有可用视频 --> <div v-for="(item, index) in videoList" :key="index"> <video-player ref="player" :options="getOptions(item.url)"> </video-player> </div> </div> </template> <script> import { VideoPlayer } from &#39;vue-video-player&#39;; export default { components:{ VideoPlayer, }, data(){ return{ selectedFile:null, videoList:[] }; }, methods:{ handleFileChange(event){ this.selectedFile=event.target.files[0]; }, async submitUpload(){ const formData=new FormData(); formData.append(&#39;file&#39;,this.selectedFile); await fetch(&#39;/api/videos/upload&#39;,{ method:&#39;POST&#39;, body:formData }).then(response=>response.json()) .then(data=>{ console.log(&#39;Success:&#39;,data); this.videoList.push({url:`/api/videos/${data.id}`}); }) .catch(error =>console.error(&#39;Error:&#39;,error)); }, getOptions(url){ return{ sources:[ {type:"video/mp4", src:url}, ], autoplay:true, loop:true }; } } }; </script> ``` 上述代码片段展示了如何在一个简单的 `Vue` 单页应用中集成视频上传及自动循环播放的功能。需要注意的是这里只是给出了基本框架结构示意,具体细节还需要根据实际情况调整优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值