CKEditor 5 集成七牛 JS-SDK 3.0 使用教程(

2020-08-28  本文已影响0人  夏堇菌

一、业务需求

二、官网教程

三、开发步骤

1、Editor 组件

要点说明:

组件源码:

// @ts-nocheck
import * as React from 'react';
import CKEditor from '@ckeditor/ckeditor5-react';
import ClassicEditor from '@ckeditor/ckeditor5-build-classic';
import UploadAdapter from './UploadAdapter';

interface IProps {
  value: string;
  onChange: (v: string) => void;
}

const MyUploadAdapterPlugin = ( editor ) => {
  editor.plugins.get( 'FileRepository' ).createUploadAdapter = ( loader ) => {
      // console.info('FileRepository', loader)
      return new UploadAdapter(loader);
  };
};

const editorConfiguration = {
  extraPlugins: [ MyUploadAdapterPlugin ]
};

const Editor = (props: IProps) => {
  return (
    <div className="editor">
      <CKEditor
        editor={ ClassicEditor }
        config={ editorConfiguration }
        data={ props.value }
        onInit={ editor => {
          // You can store the "editor" and use when it is needed.
          console.log( 'Editor is ready to use!', editor );
        } }
        onChange={ ( event, editor ) => {
          const data = editor.getData();
          console.log( { event, editor, data } );
          props.onChange(data);
        } }
        onBlur={ ( event, editor ) => {
          console.log( 'Blur.', editor );
        } }
        onFocus={ ( event, editor ) => {
          console.log( 'Focus.', editor );
        } }
      />
    </div>
  );
}

Editor.defaultProps = {
  value: '<p>Input Here!</p>'
}

export default Editor;

2、自定义 class UploadAdapter

要点说明:

插件源码:

import qiniuUpload from '@utils/qiniuUpload';
import { message } from 'antd';
import { get } from '@utils/request';
import { GET_TOKEN } from '@constants/urls';

interface IUploadPromiseData{
  default: string;
}

interface IUploadAdapter{
  loader: any;
  token: string;
  domain: string;
  upload(): Promise<IUploadPromiseData>;
}

class UploadAdapter implements IUploadAdapter{
  public loader: any;
  public token: any;
  public domain: any;

  constructor(loader: any) {
    this.loader = loader;
  }

  public async upload(): Promise<any> {
    const img = await this.loader.file;
    if (!this.token) {
      const data: any = await get(GET_TOKEN);
      this.token = data.token;
      this.domain = data.domain;
    }
    return new Promise((resolve, reject) => {
      qiniuUpload.upload(img, this.token, this.domain).then(
        (url) => {
          resolve({ default: url }) 
        },
        (err) => {
          message.error(err);
          reject();
        }
      )
    });
  }
}

export default UploadAdapter;

3. @utils/qiniuUpload

要点说明:

插件源码:

// @ts-nocheck
import * as qiniu from 'qiniu-js';

class QiniuUpload {
  public token;
  public domain;

  public check(file: any) {
    // size: kb
    const sizeLimit = 200;
    if (file.size / 1024 > sizeLimit) {
      return `上传文件大小不能超过 ${sizeLimit} KB !`
    }
    return false;
  }

  public upload(file, token, domain){
    this.token = token;
    this.domain = domain;
    return new Promise((resovle, reject) => {
      const errMsg = this.check(file);
      if (errMsg) {
        reject(errMsg);
      } else {
        const key = Math.floor(Math.random() * 1000000000000);
        const observable = qiniu.upload(file, key, token, {}, {});  
    
        this.subscription = observable.subscribe(
          (next)=>{
            console.info('Upload next', next)
          },
          (err)=>{
            console.info('Upload err ', err)
            reject(err);
          },
          (res)=>{
            console.info('Upload res ', res)
            resovle(domain + '/' + res.key,  res);
          }
        )
      }
    })
  }

  public cancel() {
    this.subscription.unsubscribe()    // 上传取消
  }
}

export default new QiniuUpload()

4、效果图

点击图片上传按钮,自动上传到七牛,上传成功后显示如上 在编辑框内确认图片,前插文字显示内容

你好,我是夏堇菌,目前本职工作是产品方向。
以前做过前端开发,但是丢了一段时间,现在重新开始学。
前端学习路上一起加油 💪💪💪

上一篇 下一篇

猜你喜欢

热点阅读