elementUi上传视频组件

在Vue+Element后台管理系统中,使用ElementUI组件进行视频上传。文章介绍了如何在上传前限制视频格式、大小和时长,并提供了HTML、JS和CSS的实现代码示例。同时,鼓励读者交流并分享宝贵意见。

背景

vue+element后台管理系统中的表单提交中需要上传视频,利用饿了吗组件可以这么搞。
要求:

  1. 文件上传之前需要处理:
    限制视频格式
    限制视频大小
    限制视频时长

实现代码:

HTML
说明:
action 必选参数,上传的地址 string
before-upload 上传文件之前的钩子 function(file)
on-progress 文件上传时的钩子 function(event, file, fileList)
http-request 覆盖默认的上传行为,可以自定义上传的实现 function

<template>
  <div>
    <el-upload
      class="avatar-uploader el-upload--text"
      action=""
      :show-file-list="false"
      :before-upload="beforeUploadVideo"
      :on-progress="uploadVideoProcess"
      style="border: 1px solid #DCDFE6;border-radius: 4px;padding: 10px;"
    >
      <video v-if="videoSrc !='' && progressFlag == false" :src="videoSrc" class="avatar" controls="controls">您的浏览器不支持视频播放</video>
      <i v-else-if="videoSrc =='' && progressFlag == false" class="el-icon-plus avatar-uploader-icon" />
      <el-progress v-if="progressFlag == true" type="circle" :percentage="loadProgress" style="margin-top:30px;" />
      <div slot="tip" class="el-upload__tip" style="color: #E6A23C;"> 请保证视频格式正确,且不超过10M。</div>
    </el-upload>
  </div>
</template>

  </div>
</template>

JS

<script>
import { uploadImg } from '@/api/common/index'
export default {
  data() {
    return {
      progressFlag: false, // 关闭进度条
      loadProgress: 0, // 进度条初始值
      videoSrc: ''

    }
  },
  methods: {
    // 进度条
    uploadVideoProcess(event, file, fileList) {
      this.loadProgress = Math.floor(event.percent)
      if (this.loadProgress >= 100) {
        this.loadProgress = 100
        // setTimeout(() => { this.progressFlag = false }, 1000) // 一秒后关闭进度条
      }
    },
    // 文件上传之前做处理
    beforeUploadVideo(file) {
      const isLt10M = file.size / 1024 / 1024 < 10
      if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb'].indexOf(file.type) === -1) {
        this.$message.error('请上传正确的视频格式')
        return false
      }
      if (!isLt10M) {
        this.$message.error('上传视频大小不能超过10MB哦!')
        return false
      }
      // 获取视频时长
      var url = URL.createObjectURL(file)
      var audioElement = new Audio(url)
      var duration
      audioElement.addEventListener('loadedmetadata', function(_event) {
        duration = audioElement.duration // 时长为秒,小数,182.36
        this.$parent.$data.wDuration = parseInt(duration)
        console.log(duration)
      })
      new Promise(function(resolve, reject) {
        const _URL = window.URL || window.webkitURL
        const videoElement = document.createElement('video')
        // 当指定的音频/视频的元数据已加载时,会发生 loadedmetadata 事件。 元数据包括:时长、尺寸(仅视频)以及文本轨道。
        videoElement.addEventListener('loadedmetadata', function(_event) {
          const duration = videoElement.duration // 视频时长
          const valid = Math.floor(duration) <= 4
          valid ? resolve() : reject()
        })
        videoElement.src = _URL.createObjectURL(file)
      }).then(() => {
        this.uploadImg(file) // 调用上传接口
      }, () => {
        this.$message.error('上传的视频时长过大,请重新上传')
        return Promise.reject()
      })
    },
    // 上传接口
    async uploadImg(file) {
      this.progressFlag = true // 显示进度条
      const fd = new FormData()
      fd.append('file', file)
      uploadImg(fd).then(response => {
        this.videoSrc = response.result.url
        this.progressFlag = false
        this.$emit('setFileSrc', this.videoSrc)
        this.$message({
          type: 'success',
          message: '上传成功!'
        })
      })
    }

  }
}
</script>

CSS

<style>
  .avatar-uploader .el-upload {
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
  }
  .avatar-uploader .el-upload:hover {
    border-color: #409EFF;
  }
  .avatar-uploader-icon {
    font-size: 28px;
    color: #8c939d;
    width: 178px;
    height: 178px;
    line-height: 178px;
    text-align: center;
  }
  .avatar {
    width: 178px;
    height: 178px;
    display: block;
  }
</style>

工作之余 用博客记录自己 希望有能帮助到各位看官
如有错误或不全面的地方望各位能提点一二和留下宝贵意见

<think>好的,用户想用VueElementUI实现视频上传组件,需要示例代码和教程。先回想一下ElementUI上传组件,记得el-upload组件可以处理文件上传。用户之前的问题可能涉及过多文件上传和预览,现在扩展到视频,可能需要调整参数和预览方式。首先,需要引入ElementUI的el-upload组件,并设置相应的属性。视频上传需要设置action属性指向后端接口,同时限制文件类型为视频格式,比如mp4、avi等。使用accept属性来限制用户选择文件时的类型,比如accept="video/*"。 然后,用户可能需要显示上传进度,所以需要配置on-progress事件来更新进度条。这里可以用ElementUI的el-progress组件配合使用。上传过程中显示进度百分比,上传成功后显示成功状态。预览部分,视频和图片不同,不能直接通过弹窗显示,可能需要使用HTML5的video标签。在上传成功后,将视频的URL绑定到video标签的src属性,这样就可以在页面上播放预览。但要注意跨域问题和服务器配置,允许视频资源的访问。另外,用户可能希望在上传前检查文件大小和格式,这可以通过before-upload钩子函数实现。如果文件不符合要求,就提示用户并取消上传。参考之前的引用,比如引用3提到使用window.open预览PDF,但视频可能需要内嵌播放器。引用5中的图片上传到本地,可能需要类似的处理,但视频文件较大,可能需要分块上传或后端处理。还需要考虑后端接口的兼容性,比如引用4提到的使用hutool工具处理文件上传,可能需要后端支持视频文件的接收和存储。但用户当前的问题集中在前端,所以示例代码可能只需要前端部分,提醒用户需要后端配合。 最后,生成相关问题,比如如何限制视频大小、如何分片上传、如何实现拖拽上传等,这些都是用户可能进一步询问的方向。</think>### Vue+ElementUI视频上传组件实现步骤 #### 一、环境配置 1. 安装ElementUI ```javascript // main.js import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI); ``` #### 二、基础组件实现 ```vue <template> <div class="video-upload"> <!-- 核心上传组件 --> <el-upload class="upload-demo" :action="uploadUrl" :on-progress="handleProgress" :on-success="handleSuccess" :before-upload="beforeUpload" :file-list="fileList" accept="video/mp4,video/avi,video/quicktime" :limit="3" > <el-button size="small" type="primary">点击上传视频</el-button> <div slot="tip" class="el-upload__tip">支持MP4/AVI/MOV格式,单文件不超过500MB</div> </el-upload> <!-- 进度显示 --> <el-progress v-if="progressVisible" :percentage="percentage" :status="progressStatus" /> <!-- 视频预览 --> <video v-if="videoUrl" controls width="400" :src="videoUrl" class="preview-video" /> </div> </template> ``` #### 三、核心逻辑实现 ```javascript <script> export default { data() { return { uploadUrl: 'https://your-api-endpoint.com/upload', // 后端接口地址 fileList: [], percentage: 0, progressVisible: false, progressStatus: '', videoUrl: '' } }, methods: { // 上传前校验 beforeUpload(file) { const isVideo = ['video/mp4','video/avi','video/quicktime'].includes(file.type) const isLt500M = file.size / 1024 / 1024 < 500 if (!isVideo) { this.$message.error('仅支持视频文件格式!') return false } if (!isLt500M) { this.$message.error('视频大小不能超过500MB!') return false } return true }, // 上传进度处理 handleProgress(event, file) { this.progressVisible = true this.percentage = parseInt(event.percent) }, // 上传成功处理 handleSuccess(response, file) { this.progressStatus = 'success' this.videoUrl = URL.createObjectURL(file.raw) // 生成本地预览地址 // 实际开发中建议使用服务器返回的URL // this.videoUrl = response.data.url } } } </script> ``` #### 四、关键功能说明 1. **格式限制**:通过`accept`属性指定支持的视频格式 2. **大小限制**:在`beforeUpload`中进行文件大小校验 3. **预览实现**:使用HTML5 `<video>`标签实现本地预览 4. **进度反馈**:结合el-progress组件显示上传进度 #### 五、扩展优化建议 1. **大文件分片上传**:使用`el-upload`的`http-request`属性覆盖默认上传行为,结合库如`simple-uploader.js`实现分片 2. **断点续传**:通过记录已上传分片信息实现续传功能 3. **封面生成**:上传完成后调用截图接口生成视频封面 4. **格式转换**:集成FFmpeg实现视频转码
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值