Адаптер загрузки не определен Проблема с загрузкой изображений в ckeditor5-angular - PullRequest
0 голосов
/ 28 августа 2018

Возможно, на этот вопрос уже есть ответы, но ни один из них не является специфичным для Angular. Вот некоторые из них

Я использую Angular 5 и следую этой документации для реализации ckeditor5-angular.

Но у меня возникают проблемы с загрузкой изображений, когда я пытаюсь загрузить изображение, которое появляется в консоли браузера.

filerepository-no-upload-adapter: адаптер загрузки не определен. Читать подробнее: https://docs.ckeditor.com/ckeditor5/latest/framework/guides/support/error-codes.html#error-filerepository-no-upload-adapter

Я пытался найти эту проблему и смог найти много решений, но буквально я не смог понять ни одного из них, потому что они не были специфичны для Angular.

Пожалуйста, помогите, как я могу загрузить изображение.

Ответы [ 4 ]

0 голосов
/ 11 апреля 2019

Я решил это, реализовав свой собственный UploadAdapter
если вы используете Editor.create(), это создаст новый элемент редактора, не связанный с угловым компонентом

<ckeditor 
[editor]="Editor" 
[(ngModel)]="content"
(ready)="onReady($event)"
>
</ckeditor>

at component.ts

  onReady($event){
    $event.plugins.get('FileRepository').createUploadAdapter = (loader)=> {
      return new UploadAdapter(loader,'',this.http);
    };
  }

UploadAdapter.ts

import { HttpParams, HttpClient } from "@angular/common/http";

export class UploadAdapter {
    constructor(
      private loader,
      public url:string,
      private http:HttpClient
      ) {
    }
//the uploadFile method use to upload image to your server
  uploadFile(file,url?:string,user?:string){
    let name = '';
    url='your api';
    let formData:FormData = new FormData();
    let headers = new Headers();
    name = file.name;
    formData.append('attachment', file, name);
    const dotIndex = name.lastIndexOf('.');
    const fileName  = dotIndex>0?name.substring(0,dotIndex):name;
    formData.append('name', fileName);
    formData.append('source', user);

    headers.append('Content-Type', 'multipart/form-data');
    headers.append('Accept', 'application/json');
    console.log('formData',formData);
    let params = new HttpParams();
    const options = {
        params: params,
        reportProgress: true,
    };
//http post return an observer
//so I need to convert to Promise
    return this.http.post(url,formData,options);
  }
//implement the upload 
  upload() {
      let upload = new Promise((resolve, reject)=>{
        this.loader['file'].then(
            (data)=>{
                this.uploadFile(data,this.url,'test')
                .subscribe(
                    (result)=>{
//resolve data formate must like this
//if **default** is missing, you will get an error
                        **resolve({ default: result['attachment'] })**
                    },
                    (error)=>{
                        reject(data.msg);
                    }
                );
            }
        );
      });
      return upload;
  }
  abort() {
      console.log("abort")
  }
}
0 голосов
/ 19 марта 2019

Я использовал ниже, кажется, работает

class UploadAdapter {
   constructor( loader ) {
      this.loader = loader;
   }

   upload() {
      return this.loader.file
            .then( file => new Promise( ( resolve, reject ) => {
                  var myReader= new FileReader();
                  myReader.onloadend = (e) => {
                     resolve({ default: myReader.result });
                  }

                  myReader.readAsDataURL(file);
            } ) );
   };
}
0 голосов
/ 28 марта 2019

Я пытался использовать раствор Захалила . Изображение отображалось в редакторе, но когда я получаю значение для обновления базы данных, у меня просто появляется:

<figure class="image"><img></figure>

Чтобы исправить это, я изменил следующий код:

return { default: "data:image/png;base64," + image };
resolve();

до:

resolve({ default: image });
0 голосов
/ 28 сентября 2018

В component.html файле добавить следующий код

<ckeditor [editor]="Editor" (ready)="onReady($event)"></ckeditor>

в component.ts функция создания файла onReady(data)

onReady(eventData) {
    eventData.plugins.get('FileRepository').createUploadAdapter = function (loader) {
      console.log(btoa(loader.file));
      return new UploadAdapter(loader);
    };
  }

Добавьте новый класс с именем UploadAdapter и добавьте следующий код: -

export class UploadAdapter {
  private loader;
  constructor(loader: any) {
    this.loader = loader;
    console.log(this.readThis(loader.file));
  }

  public upload(): Promise<any> {
    //"data:image/png;base64,"+ btoa(binaryString) 
    return this.readThis(this.loader.file);
  }

  readThis(file: File): Promise<any> {
    console.log(file)
    let imagePromise: Promise<any> = new Promise((resolve, reject) => {
      var myReader: FileReader = new FileReader();
      myReader.onloadend = (e) => {
        let image = myReader.result;
        console.log(image);
        return { default: "data:image/png;base64," + image };
        resolve();
      }
      myReader.readAsDataURL(file);
    });
    return imagePromise;
  }

}

здесь default указывает URL загруженного изображения. Я конвертировал файл в base64, но вы можете вызвать URL-адрес сервера и загрузить свой файл, а затем вернуть URL-адрес сервера с тем же ключом.

EnjOy CodInG:)

...