websoket

wangEditor上传本地视频/本地图片至阿里云oss并回显

2021-01-12  本文已影响0人  是哒哒鸭

1.上传本地图片至oss并且回显至富文本

先创建oss.js上传/图片/视频接口

import request from '@/utils/re.js'   //封装的请求

import axios from 'axios'

export function policy1() {

  return request({

    url:'url',//上传接口

    method:'get',

  })

}

export function getUUID () {

return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {

  return (c === 'x' ? (Math.random() * 16 | 0) : ('r&0x3' | '0x8')).toString(16)

})

}

export function ossUpload (file,editor) {

  var that = this;

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

      policy1().then((response) => {

      const formData = new FormData()

      formData.append('OSSAccessKeyId', response.data.accessKeyId)

      formData.append('policy', response.data.policy)

      formData.append('signature', response.data.signature)

      formData.append('key', response.data.dir +getUUID() +'_'+ file.name)

      formData.append('callback', response.data.callback)

      formData.append('file', file)

      formData.append('host',response.data.host)

      axios.post(response.data.host, formData).then((res) => {

        const { status } = res

        if (status === 200) {

          console.log('200',res)

            editor.cmd.do('insertHTML', `<img src=${res.data.data.filename} alt="">`)

          return res.data

        } else {

        }

      }).catch(err => {

        console.log(1111,err)

      })

    }).catch(err => {})

  })

}

创建wangEditor.vue组件

<template lang="html">

  <div class="editor">

    <div ref="toolbar" class="toolbar">

    </div>

    <div ref="editor" class="text">

    </div>

  </div>

</template>

<script>

  import E from 'wangeditor'

  import { ossUpload } from '@/api/oss'

  export default {

    name: 'editor',

    data() {

      return {

        // uploadPath,

        editor: null,

        info_: null,

          menus: [

          'head', // 标题

          'bold', // 粗体

          'fontSize', // 字号

          'fontName', // 字体

          'italic', // 斜体

          'underline', // 下划线

          'strikeThrough', // 删除线

          'foreColor', // 文字颜色

          'backColor', // 背景颜色

          'link', // 插入链接

          'list', // 列表

          'justify', // 对齐方式

          'quote', // 引用

          'emoticon', // 表情

          'image', // 插入图片

          'table', // 表格

          'video', // 插入视频

          'code', // 插入代码

          'undo', // 撤销

          'redo', // 重复

          'fullscreen' // 全屏

                ]

      }

    },

    model: {

      prop: 'value',

      event: 'change'

    },

    props: {

      value: {

        type: String,

        default: ''

      },

      isClear: {

        type: Boolean,

        default: false

      }

    },

    watch: {

      isClear(val) {

        // 触发清除文本域内容

        if (val) {

          this.editor.txt.clear()

          this.info_ = null

        }

      },

      value: function(value) {

        if (value !== this.editor.txt.html()) {

          this.editor.txt.html(this.value)

        }

      }

      //value为编辑框输入的内容,这里我监听了一下值,当父组件调用得时候,如果给value赋值了,子组件将会显示父组件赋给的值

    },

    mounted() {

      this.seteditor()

      this.editor.txt.html(this.value)

    },

    methods: {

      seteditor() {

        this.editor = new E(this.$refs.toolbar, this.$refs.editor);

        this.editor.customConfig = this.editor.customConfig ? this.editor.customConfig : this.editor.config;

        this.editor.customConfig.customUploadImg = async (files, insert) => {

                  const res = await ossUpload(files[0],this.editor)

                }

        this.editor.customConfig.menus = this.menus;

      //连接

      this.editor.customConfig.linkCheck = function (text, link) {

          console.log("插入的文字",text) // 插入的文字

          console.log("插入的链接",link) // 插入的链接

          return true // 返回 true 表示校验成功

      },

        this.editor.customConfig.onchange = (html) => {

          this.info_ = html // 绑定当前逐渐地值

          this.$emit('change', this.info_) // 将内容同步到父组件中

        }

        // 创建富文本编辑器

        this.editor.create()

      }

    }

  }

</script>

<style lang="css">

  .editor {

    width: 100%;

    margin: 0 auto;

    position: relative;

    z-index: 0;

  }

  .toolbar {

    border: 1px solid #ccc;

  }

  .text {

    border: 1px solid #ccc;

    min-height: 500px;

  }

</style>

效果:

2.上传本地视频至oss

因为wangEditor本身只能通过链接插入视频,不能实现上传本地视频,所以我总结多方网络经验,自己手扣了一个(就是通过ElementUI上传组件实现,拿到最终图片路径后再放进富文本,思路大概就是这样。但是插入的视频不能改变大小,如果有实现的小伙伴,就麻烦给我指点一下哈哈哈)

新建组件wangEndtorArticle.vue:(该组件功能比较完整,包括上面的上传图片)

<template>

  <div style="display: inline-flex;">

    <div class="img-list-item common mb_10" v-for="(item,index) in dialogImageUrl">

      <video width="150px" height="150px" style="padding: 0 5px;" controls="controls" :src="item"> 您的浏览器不支持视频播放</video>

      <i class="del-img" @click="forkImage(index)"></i>

    </div>

    <el-upload action="https://wtwf-product.oss-cn-chengdu.aliyuncs.com"

              :data="dataObj" :show-file-list="false"

              :auto-upload="true"

              :on-remove="handleRemove"

              :on-success="handleUploadSuccess"

              :before-upload="beforeUpload"

              :limit="maxCount"

              accept=".mp4"

              :on-exceed="handleExceed"

              :on-progress="uploadVideoProcess">

      <span class="warp">

        <el-progress v-if="videoFlag == true" type="circle" :percentage="videoUploadPercent" style="margin-top:30px;position: relative;top: -15px;">

        </el-progress>

        <i v-else class="el-icon-plus" :style="{fontSize: '18px',fontWeight:'bold',padding:paddings,position:'relative',top:'60px'}"></i>

      </span>

    </el-upload>

  </div>

</template>

<script>

  import {

    policy1

  } from '@/api/oss'

  export default {

    props: {

      value: Array,

      //最大上传图片数量

      maxCount: {

        type: Number,

        default: 5

      },

      w: {

        type: String,

        // default:'100px'

      },

      h: {

        type: String,

        // default:'100px'

      },

      paddings: {

        type: String,

      }

    },

    data: function() {

      return {

        videoFlag: false,

        videoUploadPercent: 0,

        videis: false,

        dataObj: {

          policy: '',

          signature: '',

          key: '',

          ossaccessKeyId: '',

          dir: '',

          host: ''

        },

        dialogVisible: false,

        dialogImageUrl: []

      }

    },

    computed: {

      fileList() {

        let fileList = [];

        for (let i = 0; i < this.value.length; i++) {

          fileList.push({

            url: this.value[i]

          });

        }

        console.log('视频---->', fileList);

        console.log('视频22222222222222---->', this.dialogImageUrl);

        return fileList;

      }

    },

    methods: {

      //删除视频

      forkImage(index) {

        // console.log('当前索引', index);

        this.dialogImageUrl.splice(index, 1);

        // console.log('删除后的数组数组', this.dialogImageUrl);

      },

      getUUID() {

        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {

          return (c === 'x' ? (Math.random() * 16 | 0) : ('r&0x3' | '0x8')).toString(16)

        })

      },

      emitInput(fileList) {

        let value = [];

        for (let i = 0; i < fileList.length; i++) {

          value.push(fileList[i].url);

        }

        this.$emit('input', value)

      },

      handleRemove(file, fileList) {

        this.emitInput(fileList)

      },

      handleUploadSuccess(res, file) {

        // console.log("成功后", file)

        // console.log('获取图片', res.data);

        let url = this.dataObj.host + '/' + this.dataObj.key.replace('${filename}', file.name);

        // console.log('路径', url);

        this.fileList.push({

          name: file.name,

          url: url

        });

        this.dialogVisible = true;

        this.dialogImageUrl.push(url);

        // console.log("视频地址", this.);

        this.emitInput(this.fileList);

        this.videoFlag = false;

        this.videoUploadPercent = 0;

      },

      uploadVideoProcess(event, file, fileList) {

        this.videoFlag = true;

        this.videoUploadPercent = Math.floor(event.percent);

      },

      beforeUpload(file) {

        var fileSize = file.size / 1024 / 1024 < 100;

        console.log('视频大小', fileSize);

        if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb', 'video/mov'].indexOf(file.type) ==

          -1) {

          this.$message({

            type: 'warning',

            message: '请上传正确的视频格式'

          });

          return false;

        }

        if (!fileSize) {

          this.$message({

            type: 'warning',

            message: '视频大小不能超过100MB'

          });

          return false;

        }

        this.videoFlag = true;

        console.log("上传视频值", file);

        const _self = this

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

          policy1().then(response => {

            console.log("视频---->获取数据", response.data);

            _self.dataObj.policy = response.data.policy;

            // console.log('policy值',response.data.policy);

            _self.dataObj.signature = response.data.signature;

            // console.log('signature值',response.data.signature);

            _self.dataObj.ossaccessKeyId = response.data.accessKeyId;

            // console.log('ossaccessKeyId值',response.data.accessKeyId);

            _self.dataObj.key = response.data.dir + this.getUUID() + '_${filename}';

            console.log('视频---->key值', response.data.dir + this.getUUID() + '_${filename}');

            _self.dataObj.dir = response.data.dir;

            console.log('视频---->dir值', response.data.dir);

            _self.dataObj.host = response.data.host;

            _self.dataObj.callback = response.data.callback;

            resolve(true)

          }).catch(err => {

            console.log(err)

            reject(false)

          })

        })

      },

      handlePreview(file) {

        // console.log('获取视频', file.url);

        this.dialogVisible = true;

        this.dialogImageUrl = file.url;

      },

      handleExceed(files, fileList) {

        // console.log("获取上传视频", files, fileList);

        this.$message({

          message: '最多只能上传' + this.maxCount + '个视频',

          type: 'warning',

          duration: 1000

        });

      },

    }

  }

</script>

<style lang="scss" scoped>

  .warp {

    display: inline-block;

    // padding: 54px 64px;

    width: 150px;

    height: 151px;

    border: 1px dashed #DEE5ED;

  }

  /deep/.el-upload-list {

    display: none;

  }

  .el-upload-video {

    width: 149px;

    height: 149px;

    border: 1px dashed #d9d9d9;

    border-radius: 6px;

    cursor: pointer;

    position: relative;

    overflow: hidden;

  }

  .el-upload-video-i {

    font-size: 20px;

    font-weight: bold;

    padding-top: 43px;

    color: #8c939d;

    width: 50px;

    height: 50px;

    line-height: 50px;

    text-align: center;

  }

  //视频

  .img-list-item {

    position: relative;

    margin: auto;

  }

  // .img-list-item img {

  //  box-sizing: border-box;

  //  vertical-align: middle;

  //  border: 0;

  // }

  .img-list-item i.del-img {

    width: 20px;

    height: 20px;

    display: inline-block;

    background: rgba(0, 0, 0, .6);

    background-image: url(../assets/images/close.png);

    background-size: 18px;

    background-repeat: no-repeat;

    background-position: 50%;

    position: absolute;

    top: 0;

    right: -1px;

  }

</style>

3.页面调用

<editor-bar v-model="detail" :isClear="isClear" ></editor-bar>

import EditorBar from '../../../components/wangEndtorArticle.vue'   //引入组件

export default {

    components: {

      EditorBar   //注册组件

    },

    data() {

      return {

               detail:"   "  //存放富文本内容

               }

}

}

效果:

查看了很多资料,有些忘记保存                      请看过的小伙伴们留个赞哟(前端小白请各位大佬多多指教)!!!!

https://blog.csdn.net/weixin_45455422/article/details/106380143?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-9.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-9.control

上一篇下一篇

猜你喜欢

热点阅读