web-dev-qa-db-ja.com

アップロードアダプタが定義されていないckeditor5-angularでの画像のアップロードに関する問題

この質問はすでに回答している可能性がありますが、どれもAngular具体的ではありません。ここにそれらのいくつかを示します

私はAngular 5とそれに続く this ドキュメントを使用してckeditor5-angularを実装しています。

しかし、画像のアップロードに問題があります。画像をアップロードしようとすると、ブラウザコンソールに表示されます。

filerepository-no-upload-adapter:アップロードアダプターが定義されていません。詳細: https://docs.ckeditor.com/ckeditor5/latest/framework/guides/support/error-codes.html#error-filerepository-no-upload-adapter

私はこの問題を検索してみましたが、多くの解決策を見つけることができましたが、Angular具体的ではなかったため、文字通りそれらの1つを理解できませんでした。

画像をアップロードする方法を教えてください。

6
Adnan Sheikh

_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 :)

9
Kapil Thakkar

私は自分のUploadAdapterを実装することでこれを解決しました
Editor.create()を使用すると、angularコンポーネントに関連付けられず、新しいエディター要素が作成されます

<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);
    };
  }

ploadAdapter.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")
  }
}
4
anysunflower

以下を使用しましたが動作するようです

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);
            } ) );
   };
}
1
zackhalil

zackhalil's solution を使おうとしていました。画像はエディターに表示されましたが、データベースを更新するための値を取得すると、次のようになります。

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

これを修正するために、次のコードを変更しました。

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

に:

resolve({ default: image });
0
woj1965