首页 > 其他分享 >VUE前端实现视频截图并上传到服务器

VUE前端实现视频截图并上传到服务器

时间:2023-12-18 19:07:27浏览次数:31  
标签:截图 VUE const 上传 video 服务器 message data


做视频上传的时候有时候需要上传预览图,后端一般可以用FFMPEG来实现,前端也可以直接截图,这个功能不需要后台实现,VUE前端利用canvas画图,然后转换Base64就可以完成。

1.前端代码

<el-form-item label="视频地址" required prop="videoURL">
        <el-upload
          :action="uploadURL"
          :show-file-list="true"
          :on-preview="handlePictureCardPreview"
          :on-remove="handleRemove"
          :on-success="handleUploadvideo"
          :headers="headerObj"
          name="img"
        >
          <video
            v-if="formData.videoURL"
            style="width:300px"
            :src="formData.videoURL"
            crossOrigin="Anonymous"
            controls
          />
          <i v-else class="el-icon-plus avatar-uploader-icon" />
        </el-upload>
        <div class="tips">
          只能上传MP4格式文件,文件不能超过50M,您可以拖动视频进度条截取自己需要的截图
        </div>
      </el-form-item>
      <el-form-item label="">
        <el-button @click="cutPicture">
          截图上传图片封面
        </el-button>
        <canvas id="myCanvas" style="display: none" />
      </el-form-item>
      <el-form-item label="图片地址" required prop="imgURL">
        <el-upload
          :action="uploadURL"
          :show-file-list="true"
          :on-preview="handlePictureCardPreview"
          :on-remove="handleRemove"
          :on-success="handleUpload"
          :headers="headerObj"
          name="img"
        >
          <el-image
            v-if="formData.imgURL"
            style="width: 115px; height: 60px"
            :src="formData.imgURL"
          />
          <i v-else class="el-icon-plus avatar-uploader-icon" />
        </el-upload>
        <div class="tips">
          只能上传jpg/png格式文件,文件不能超过500kb
        </div>
      </el-form-item>

2.TS脚本

methods: {
    // 截取当前帧的图片
    cutPicture() {
      if (this.formData.videoURL.length === 0) {
        this.$message.error('请先上传视频!点击截图后再操作!')
        return false
      }

      var video = document.querySelector('video')
      const canvas = document.getElementById('myCanvas') // 获取 canvas 对象
      const ctx = canvas.getContext('2d') // 绘制2d
      video.crossOrigin = 'anonymous' // 解决跨域问题,也就是提示污染资源无法转换视频
      video.currentTime = 2 // 第N帧
      video.oncanplay = () => {
        canvas.width = video.clientWidth // 获取视频宽度
        canvas.height = video.clientHeight // 获取视频高度
        // 利用canvas对象方法绘图
        ctx.drawImage(video, 0, 0, video.clientWidth, video.clientHeight)
      }
      // 转换成base64形式
      var oGrayImg = canvas.toDataURL('image/jpeg')// 截取后的视频封面
      const file = this.getFileByBase64(oGrayImg)
      console.log('imgfilename', file)
      const formData = new FormData() // 创建一个form类型的数据
      formData.append('img', file)
      // axios请求,将截图传给后端API
      this.loadUploadPhoto(formData).then((res) => {
        console.log(res) //  处理成功的函数 相当于success
      })
        .catch((error) => {
          console.log(error) //  错误处理 相当于error
        })
    },
    //   base64 转 file----------------------begin
    getFileByBase64(data) {
      const blobData = this.dataURLtoBlob(data)
      return this.blobToFile(blobData)
    },
    // 1,先将base64转换为blob
    dataURLtoBlob(dataurl) {
      const arr = dataurl.split(',')
      const mime = arr[0].match(/:(.*?);/)[1]
      const bstr = atob(arr[1])
      let n = bstr.length
      const u8arr = new Uint8Array(n)
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
      }
      return new Blob([u8arr], {
        type: mime
      })
    },
    // 2,再将blob转换为file
    blobToFile(theBlob, fileName) {
      theBlob.lastModifiedDate = new Date() // 文件最后的修改日期
      theBlob.name = fileName // 文件名
      return new File([theBlob], fileName, {
        type: theBlob.type,
        lastModified: Date.now()
      })
    },
    //   base64 转 file--------------------------end
    handlePictureCardPreview() {},
    handleRemove() {},
    handleUpload(data) {
      console.log(data)
      if (data.code === 200) {
        this.$message({
          type: 'success',
          message: '图片上传成功'
        })
        console.log('文件上传成功后,图片名=' + data.data.url)
        this.formData.imgURL = data.data.url
      } else {
        this.$message({
          type: 'error',
          message: '错误:' + data.msg
        })
      }
    },
    handleUploadvideo(data) {
      if (data.code === 200) {
        this.$message({
          type: 'success',
          message: '视频上传成功'
        })
        console.log('文件上传成功后,视频名=' + data.data.url)
        this.formData.videoURL = data.data.url
        console.log(this.formData)
      } else {
        this.$message({
          type: 'error',
          message: '错误:' + data.msg
        })
      }
    },
    // 封装截图上传
    async loadUploadPhoto(file) {
      await UploadPhoto(file).then((res) => {
        console.log('截图上传', res)
        if (res.data.code === 200) {
          this.$message({
            type: 'success',
            message: '添加截图上传成功'
          })
          console.log('截图文件上传成功后,文件名=' + res.data.data.url)
          this.formData.imgURL = res.data.data.url
        } else {
          this.$message.error('截图上传失败' + res.data.msg)
        }
      })
    },

标签:截图,VUE,const,上传,video,服务器,message,data
From: https://blog.51cto.com/u_52294/8876483

相关文章

  • Vue知识系列(2)每天10个小知识点
    @TOC......
  • Linux搭建FTP服务器
    一、概念简介vsftpd(verysecureFTPdaemon)是Linux下的一款小巧轻快、安全易用的FTP服务器软件,本次实验介绍如何在Linux上安装并配置vsftpd。FTP(FileTransferProtocol)是一种文件传输协议,基于客户端/服务器架构,支持以下两种工作模式:主动模式:客户端向FTP服务器发送端口信息,由......
  • vue3.0+vite问题汇总
    1、找不到模块“vite”。你的意思是要将"moduleResolution"选项设置为"node",还是要将别名添加到"paths"选项中 解决方法(tsconfig.json添加如下代码,添加之后重启;重启之后如果仍然有问题,可能是编辑器版本比较旧,升级编辑器版本,我从vscodev1.74.x更新到了v1.85.1解决了):"c......
  • 智云服务器软件打印报表
    1、服务器上安装office(实测office2013可用)2、服务器上安装pdf阅读器3、iis应用程序池中Classic.NETAppPool——>标识(改成自定义,管理员账户)【不改这个会出现用代码能打印报表,用网页无法打印,报错为8070005】   4、创建desktop文件夹【不创建此文件夹用代码能生成报表,但......
  • Vue 过渡 & 动画
    在Vue的过渡效果中,.enter-active、.leave-active、.enter和.leave-to是一些预定义的CSS类名,用于控制过渡的不同阶段。.enter-active:表示进入过渡的活动状态。在元素插入到DOM中时添加,然后在过渡结束时移除。通过设置此类的样式,可以定义元素进入过渡时的动画效果。.......
  • SVN更换服务器地址
    写在前面:之前有更换过一次不过转眼又忘了,对自己的记忆不抱希望了!问题描述:公司的svn地址经常会出边变更的情况,这时如果不想再次全部checkout代码的话就得手动变更svn服务器地址了!具体步骤:打开已检出工程的根目录:在根目录的空白位置激活右键SVN菜单,选择“Relocate”修改......
  • vue3 相关知识汇总
    1组合式api和选项式api  1.1概念  选项式api:用包含多个选项的对象来描述组件的逻辑。  组合式api:组合式api使用导入的API函数来描述组件逻辑。组合式API通常会与<scriptsetup>搭配使用。  1.2应用场景    选项式api:不需要使用构建工具或者低复......
  • zabbix如何监控服务器
    1.zabbix架构图 zabbix核心概念先记住如下zabbix中的核心几个概念主机(HOST):就是具体的一个监控对象,某一个被监控的实例,可以是一个数据库,也可以是一个操作系统。模板(Template):定义了具体一类监控对象的抽象,比如Windows模板,就是用来专门在监控Windows的时候,直......
  • 『亚马逊云科技产品测评』AWS云服务器EC2实例实现ByConity快速部署
    前言亚马逊是全球最大的在线零售商和云计算服务提供商。AWS云服务器在全球范围内都备受推崇,被众多业内人士誉为“云计算服务的行业标准”。在国内,亚马逊AWS也以其卓越的性能和服务满足了众多用户的需求,拥有着较高的市场份额和竞争力。同时也是出海用户的首选云服务。作为一款主流的......
  • 戴尔PowerEdge R750 机架式服务器初始安装Windows Server 2019 服务器系统
    2.安装原版WindowsServer2019操作系统安装操作系统时在SSD硬盘上无法安装,错误如下: 1.在BIOS界面下检查物理磁盘是否处于online状态:2.将“FirmwareDeviceOrder”设置为enable,并重启:设置步骤:Vew-MainMenu-ControllerManagement-AdvancedControllerProperties,将......