魔改 Simditor 编辑器,增强自定义上传

2018-07-13 今天得空,就来梳理下这个东东。

这个现场情况是这样的:

  • 需要将附件通过web直传到Aliyun-OSS
  • web-client upload file -> Aliyun-OSS Server -> response file-token -> web-client upload file-token to private-server -> response source-url -> web-client preview
  • 这个需求,就必须得自行编写个Simditor-upload插件了

  • Simditor-upload插件 : simditor-http-upload.js
  • Simditor配置:simditor.config.js

simditor-http-upload.js

/* eslint-disable */
import $ from 'jquery'
import Simditor from 'simditor'

const inputAttribute = {
  accept: 'image/gif,image/jpeg,image/jpg,image/png,image/svg',
  multiple: false
}

class HttpUploadButton extends Simditor.Button {
  constructor(...args) {
    super(...args)
    this.i18n = {
      'zh-CN': {
        httpupload: '上传文件'
      },
      'en-US': {
        httpupload: 'upload file'
      }
    }
    this.init()
  }

  init() {
    const {
      httpUpload
    } = this.editor.opts
    if (!httpUpload && !httpUpload.bindUpload) {
      throw new Error('upload httpUpload must config httpUpload.')
    }

    this.input = $('<input />', {
      type: 'file',
      class: 'plugin-http-upload',
      accept: inputAttribute.accept,
      multiple: inputAttribute.multiple,
      style: 'position:absolute;top:0;right:0;opacity:0;filter:alpha(opacity=0);cursor:pointer;'
    }).prependTo(this.editor.el)

    this.editor.el.on('click mouseup', '.toolbar-item-httpupload', (e) => {
      if (!this.editor.selection.range()) {
        console.warn('current not is focus.')
        httpUpload.error('请点击编辑区域,然后上传')
        return undefined
      }
      this.$rootNodes = this.editor.selection.blockNodes()
      this.editor.selection.save()
      this.input.trigger('click')
      e.stopPropagation()
    })
    this.editor.el.on('change', '.plugin-http-upload', () => {
      httpUpload.bindUpload(this.input, (data) => {
        this.input.val('')
        if (['', null, undefined].indexOf(data) === -1) {
          let $insert = ''
          if (Array.isArray(data)) {
            const imgs = data.map(link => `<img src="${link}">`)
            $insert = $(`${imgs.join('')}`)
          } else if (typeof data === 'string') {
            $insert = /^http/.test(data) ? $(`<img src="${data}">`) : $(`<span>${data}</span>`)
          }
          this.editor.selection.restore()
          this.editor.selection.insertNode($insert)
        }
        this.editor.trigger('valuechanged')
        this.editor.trigger('selectionchanged')
      })
    })
  }
}
HttpUploadButton.prototype.type = 'ul.simditor-uploadfile'
HttpUploadButton.prototype.name = 'httpupload'
// HttpUploadButton.prototype.icon = 'upload'
HttpUploadButton.prototype.icon = 'picture-o'

export default (option = {}) => {
  Object.assign(inputAttribute, option)
  Simditor.Toolbar.addButton(HttpUploadButton)
}


simditor.config.js

/* eslint-disable */
import { Toast } from 'mint-ui'
import Simditor from 'simditor'
import SimditorHttpUpload from './simditor-http-upload'

class SimditorConfig {
  constructor(context, el) {
    // 组件环境
    this.context = context
    // 编辑器实例
    this.instance = this.init(el)
  }

  init(el) {
    SimditorHttpUpload({
      accept: 'image/jpeg,image/jpg,image/png'
    })
    return new Simditor({
      textarea: document.querySelector(el),
      toolbar: ['bold', 'italic', '|', 'httpupload'],
      placeholder: '请输入正文',
      toolbarFloat: true,
      toolbarFloatOffset: 0,
      pasteImage: false,
      httpUpload: {
        bindUpload: this.bindAttachUpload.bind(this),
        error: (err) => {
          console.warn(`httpUpload Error: ${err}`)
          Toast(err)
        }
      }
    })
  }

  // 绑定上传
  bindAttachUpload(uploadInput, callback) {
    if (callback) {
      this.handleUpload(uploadInput[0].files)
        .then((list) => {
          callback(list)
        })
        .catch(err => console.warn(err))
    }
  }

  // 销毁
  destroy() {
    this.instance.destroy()
  }

  // 真实上传
  handleUpload(files) {
    return new Promise((resolve, reject) => {
      if (this.context.httpUpload) {
        this.context.httpUpload({
          files,
          success: (list) => {
            resolve(list)
          }
        })
      } else {
        reject('not found methods: httpUpload.')
        throw new Error(`${this.context} not found methods: httpUpload.`)
      }
    })
  }
}

export default SimditorConfig


使用

Index.vue

import SimditorConfig from './simditor.config'

export default {
  name: 'RichText',
  mounted() {
    this.$nextTick(() => {
      this.editor = new SimditorConfig(this, '#editor')
    })
  },
  methods: {
    // 三方上传
    httpUpload({ files, success } = {}) {
      if (!this.oss) {
        this.$topTips('关键信息初始化失败,请刷新重试')
        return undefined
      }

      const upload = (fileList) => {
        fileList.forEach((file) => {
          file.progress = (p) => {
            this.progress = p * 100
          }
        })
        this.handleUploadFileMultiple({ files: fileList })
          .then((response) => {
            const imgs = response.map(obj => obj.url)
            success(imgs)
          })
          .catch((err) => {
            console.error(err)
          })
      }
      upload([...files])
    }
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容