CKEditor5 自定义上传图片

公司的网站中也要集成富文本编辑器,我们选择了CKEditor 5,官方网址

在集成的过程中需要完成图片上传到公司服务器,在文档中有三种方法,三种方法,

第一种是用CKEditor 的服务肯定是不行,第二种需要后端配置一些东西,最好也不要麻烦别人,第三种就是自己根据引导去写一个自定义插件,因为他都基本写好了,所以比较容易,于是就自己写了一个MyUploadAdapter.js 文件,在需要的地方引用就可以使用其中的init方法来生成一个可以把图片上传到公司服务器的富文本编辑器,代码如下


import ClassicEditor from '@ckeditor/ckeditor5-build-classic';
export default class MyUploadAdapter {
    constructor( loader, url ) {
        // The FileLoader instance to use during the upload. It sounds scary but do not
        // worry — the loader will be passed into the adapter later on in this guide.
        this.loader = loader;


        // The upload URL in your server back-end. This is the address the XMLHttpRequest
        // will send the image data to.
        this.url = url;
    }

    // Starts the upload process.
   upload() {
       return new Promise( ( resolve, reject ) => {
           this._initRequest();
           this._initListeners( resolve, reject );
           this._sendRequest();
       } );
   }

   // Aborts the upload process.
   abort() {
       if ( this.xhr ) {
           this.xhr.abort();
       }
   }

   // Initializes the XMLHttpRequest object using the URL passed to the constructor.
   _initRequest() {
       const xhr = this.xhr = new XMLHttpRequest();

       // Note that your request may look different. It is up to you and your editor
       // integration to choose the right communication channel. This example uses
       // the POST request with JSON as a data structure but your configuration
       // could be different.
       xhr.open( 'POST', this.url, true );
       xhr.responseType = 'json';
   }

   // Initializes XMLHttpRequest listeners.
    _initListeners( resolve, reject ) {
        const xhr = this.xhr;
        const loader = this.loader;
        const genericErrorText = 'Couldn\'t upload file:' + ` ${ loader.file.name }.`;

        xhr.addEventListener( 'error', () => reject( genericErrorText ) );
        xhr.addEventListener( 'abort', () => reject() );
        xhr.addEventListener( 'load', () => {
            const response = xhr.response;

            // This example assumes the XHR server's "response" object will come with
            // an "error" which has its own "message" that can be passed to reject()
            // in the upload promise.
            //
            // Your integration may handle upload errors in a different way so make sure
            // it is done properly. The reject() function must be called when the upload fails.
            if ( !response || response.error ) {
                return reject( response && response.error ? response.error.message : genericErrorText );
            }

            // If the upload is successful, resolve the upload promise with an object containing
            // at least the "default" URL, pointing to the image on the server.
            // This URL will be used to display the image in the content. Learn more in the
            // UploadAdapter#upload documentation.
            resolve( {
                default: response.url
            } );
        } );
        // Upload progress when it is supported. The FileLoader has the #uploadTotal and #uploaded
        // properties which are used e.g. to display the upload progress bar in the editor
        // user interface.
        if ( xhr.upload ) {
            xhr.upload.addEventListener( 'progress', evt => {
                if ( evt.lengthComputable ) {
                    loader.uploadTotal = evt.total;
                    loader.uploaded = evt.loaded;
                }
            } );
        }
    }

    // Prepares the data and sends the request.
    _sendRequest() {

        // Prepare the form data.
        const data = new FormData();
        data.append( 'File', this.loader.file );

        // Send the request.
        this.xhr.send( data );
    }

}

export let MyCustomUploadAdapterPlugin = ( editor ) => {
  editor.plugins.get( 'FileRepository' ).createUploadAdapter = ( loader ) => {
      // Configure the URL to the upload script in your back-end here!
      return new MyUploadAdapter( loader, '/common/img/upload' );
  };
}

export let init = () => {
  ClassicEditor
  .create( document.querySelector( '#editor'),{
    toolbar: ["heading", "|", "alignment:left", "alignment:center", "alignment:right", "alignment:adjust", "|", "bold", "italic", "blockQuote", "link", "|", "bulletedList", "numberedList", "imageUpload", "|", "undo", "redo"],
    extraPlugins: [ MyCustomUploadAdapterPlugin ]
  } )
  .then((editor) => {
      console.log( editor );
  } )
  .catch( (error) => {
      console.error( error );
  } );
}

调研集成的过程比普通业务代码要复杂一些:

首先是文件的导出导入出了一些问题,

其次是公司的上传接口,即new MyUploadAdapter  处传入的第二个参数,是要首先登陆成功才可以调用,

最后是,_sendRequest方法中的data.append( 'File', this.loader.file );  这里的File 要根据接口定义的变量名来写,

调试过程需要首先弄明白后端的接口需要什么样的数据,根据后端的要求来调整自己的MyUploadAdapter.js

你可能感兴趣的:(技术总结,编辑器,上传图片,前端,CKEditor)