首页 > 建站教程 > 编辑器、IDE >  vue3 tinymce编辑器上传视频插件封装正文

vue3 tinymce编辑器上传视频插件封装

vue3项目使用tinymce作为编辑器,tinymce默认的视频是不能上传的,仅支持网络地址,官方插件也看了下,没有视频上传插件。客户要求必须能够上传,而且还要限制上传大小。没办法,就自己研究了下,最终实现效果如下:

tinymce编辑器上传视频插件


1、新建插件文件utils.js,代码如下,解释就放在注释里:

/* eslint-disable */

import { ElLoading, ElMessage } from 'element-plus'

import axios from 'axios'

import tool from '@/utils/tool'

import DEFAULT_CONFIG from '@/config/index'


// 创建一个上传框,并return出去

function createInput(accept) {

  const input = document.createElement('input')

  input.setAttribute('type', 'file')

  input.setAttribute('accept', accept)

  return input

}


// axios上传文件

function uploadToOss(file) {

  return new Promise((resolve, reject) => {

    let param = new FormData()

    param.append('file',file)

    let Authorization = ''

    if (tool.data.get("TOKEN")) {

      Authorization = tool.data.get("TOKEN")

    } else {

      Authorization = 'Basic dnVlOnZ1ZQ=='

    }

    let config = {

      headers:{

        // 上传一定要有这个form-data

        'Content-Type':'multipart/form-data',

        Authorization

      }

    }

    axios.post('/api/tool/oss/upload', param, config).then(res=>{

      // 上传后处理,直接将最终的url resolve出去

      if(res.status === 200 && res.data) {

        if(res.data.status === 200) {

          resolve(res.data.data)

        } else {

          reject(res.data)

        }

      } else {

        reject(res)

      }

    }).catch(e => {

      reject(e)

    })

  })

}


// 导出插件

export const uploadVideoPlugin = (editor) => {

  editor.ui.registry.addButton('uploadVideo', {

    // 这个icon是tinymce自带的,更多icon可见:node_modules/tinymce/icons/default/icons.js,当然也能自己定义,详见https://www.tiny.cloud/docs/tinymce/7/custom-basic-toolbar-button/

    icon: 'embed',

    tooltip: '上传视频',

    // onAction是插件被点击时的回调

    onAction: function () {

      const input = createInput('.mp4, .webm, .ogg')

      // 自动点击

      input.click()

      input.onchange = async function () {

        const file = this.files[0]

        const size = file.size/1024/1024

        // 限制上传大小,根据自己的情况而定

        if(size >= 50) {

          ElMessage.error('视频不能超过50M')

          return

        }

        // loading

        const loadingInstance = ElLoading.service({

          fullscreen: true

        })

        // 调用上传方法

        uploadToOss(file).then((url) => {

          // 获取到编辑器实例,如果你的项目使用了eslint,这里可能报错,tinymce未定义,在文件头部加个注释“/* eslint-disable */”

          const activeEditor = tinymce.activeEditor

          // 将视频插入到编辑器,这里的地址直接拼全路径,根据自己需求决定

          activeEditor.insertContent(`<video controls name="media" style="width:100%; height: auto;"><source src="https://5imoban.oss-cn.aliyuncs.com${url}"></video>`)

          // 关闭loading

          loadingInstance.close()

        }).catch(e => {

          console.log(e)

          ElMessage.error('上传失败')

          loadingInstance.close()

        })

      }

    }

  })

}


2、引入并使用自定义的tinymce上传插件

/* 引入视频上传插件 */

import { uploadVideoPlugin } from './utils'


/* 注册上传插件 */

tinymce.PluginManager.add('uploadVideo', uploadVideoPlugin)


export default {

  props: {

    plugins: {

      type: [String, Array],

      // 这里加入 uploadVideo

      default: 'uploadVideo image link table quickbars pagebreak lists advlist'

    },

    toolbar: {

      type: [String, Array],

      // 工具栏配置 uploadVideo

      default: 'undo redo | forecolor backcolor bold italic underline strikethrough link image uploadVideo | blocks fontfamily fontsize | \

        alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | pagebreak | \

        table selectall'

    },

  },

  // 更多代码...

}