美文网首页
vue调用腾讯云sdk实现视频上传并实时展示更新上传进度

vue调用腾讯云sdk实现视频上传并实时展示更新上传进度

作者: 风中凌乱的男子 | 来源:发表于2020-07-14 18:19 被阅读0次

话不多说,上车吧铁子,上传速度和腾讯云后台一样快!

惯例,效果图先出

image.png
image.png
image.png

扔代码

<template>
  <div>
      <!-- 视频上传 -->
      <el-form-item label="视频上传">
        <el-button @click="vExampleAdd">点击上传<i class="el-icon-upload el-icon--right"></i></el-button>
        <span v-html="uploadLoading"></span>
        <form ref="vExample">
          <input type="file" style="display:none;" ref="vExampleFile" @change="vExampleUpload" />
        </form>
      </el-form-item>
      <!-- 视频名称 -->
      <el-form-item label="视频名称" v-if="uploaderInfos.progress == 1">
        <span>{{uploaderInfos.videoInfo.name + '.' + uploaderInfos.videoInfo.type}}</span>
      </el-form-item>
      <!-- 上传进度 -->
      <el-form-item label="上传进度" v-if="uploaderInfos.progress != 0">
        <el-progress :percentage="uploaderInfos.progress * 100" class="progress" :text-inside="true" :stroke-width="15" />
        <el-button @click="resetUp" v-if="uploaderInfos.progress != 1 && uploaderInfos.progress != 0" v-show="showReBtn">取消上传<i class="el-icon-upload el-icon--right"></i></el-button>
      </el-form-item>
  </div>
</template>

<script>
import { getsign } from "@/api/common";
import TcVod from 'vod-js-sdk-v6'
export default {
  data() {
    return {
      showReBtn: true,//取消上传后 改成false不显示显示按钮
      uploadLoading: "", //上传状态html
      ruleForm: {},
      uploader: {},//上传文件对象
      uploaderInfos: {
        videoInfo: "",//上传文件的name和type
        isVideoUploadSuccess: false, //是否上传成功,默认false
        isVideoUploadCancel: false,//是否取消上传 ,默认false
        progress: 0, //进度条 ,默认0
        videoUrl: '', //上传成功后videoUrl
      },//上传详情
    }
  },
  methods: {
    //点击上传视频按钮触发
    vExampleAdd() {
      this.$refs.vExampleFile.click()
    },
    //input change 事件
    vExampleUpload() {
      this.uploadLoading = '<i class="el-icon-loading icon"></i>解析中...'
      var self = this;
      var mediaFile = this.$refs.vExampleFile.files[0]
      this.uploader = this.tcVod.upload({
        mediaFile: mediaFile,
      })
      // 视频上传进度
      this.uploader.on('media_progress', function (info) {
        self.uploadLoading = '<i class="el-icon-loading icon"></i>上传中...'
        self.uploaderInfos.progress = info.percent;
      })
      // 视频上传完成时
      this.uploader.on('media_upload', function (info) {
        self.uploaderInfos.isVideoUploadSuccess = true;
        self.$message.success('上传成功')
        self.uploadLoading = '上传成功!'
      })

      self.uploaderInfos.videoInfo = this.uploader.videoInfo //用来展示视频的名字和type 例如:xxx.mp4

      this.uploader.done().then(function (doneResult) {
        self.uploaderInfos.videoUrl = doneResult.video.url
        self.$emit("uploadSuccess",self.uploaderInfos.videoUrl)
        self.$refs.vExample.reset();
      })
    },
    //取消上传
    resetUp() {
      this.uploaderInfos.isVideoUploadCancel = true;
      this.uploader.cancel()
      this.$message.error("您取消了上传!")
      this.uploadLoading = '已取消'
      this.$refs.vExample.reset() //避免选择相同文件不触发change事件
      this.showReBtn = false
      this.uploaderInfos.progress = 0
    }
  },
  created() {
    //获取签名
    function getSignature() {
      return getsign(JSON.stringify({
        "Action": "GetUgcUploadSign"
      })).then(function (response) {
        return response.data.sign
      })
    };
    this.tcVod = new TcVod({
      getSignature: getSignature
    });
  },
}
</script>

<style lang="scss" scoped>
.progress {
  display: inline-block;
  width: 400px;
}
/deep/ .icon {
  margin-right: 5px;
}
</style>

封装成一个简易组件了,别的页面直接引入调用

<template>
  <div class="main">
    <el-card>
      <el-form :model="ruleForm" label-width="100px" label-position="left" ref="ruleForm" class="demo-ruleForm">
        <uploadVideo @uploadSuccess='uploadSuccess'></uploadVideo>
      </el-form>
    </el-card>
  </div>
</template>

<script>
import { getsign } from "@/api/common";
import TcVod from 'vod-js-sdk-v6'
import uploadVideo from "@/components/Common/uploadVideo";
export default {
  data() {
    return {
      ruleForm: {},
      formData: {
        videoUrl: ''
      }
    }
  },
  methods: {
    //上传成功回调
    uploadSuccess(url) {
      this.formData.videoUrl = url
    }
  },

  components: {
    uploadVideo,
  },
}
</script>

<style lang="scss" scoped>
.main {
  margin: 10px;
}
</style>

不懂的 可以私聊问我 ,广交天下朋友~

相关文章

网友评论

      本文标题:vue调用腾讯云sdk实现视频上传并实时展示更新上传进度

      本文链接:https://www.haomeiwen.com/subject/fwbfhktx.html