この質問はすでに回答している可能性がありますが、どれも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つを理解できませんでした。
画像をアップロードする方法を教えてください。
_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 :)
私は自分の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")
}
}
以下を使用しましたが動作するようです
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);
} ) );
};
}
zackhalil's solution を使おうとしていました。画像はエディターに表示されましたが、データベースを更新するための値を取得すると、次のようになります。
<figure class="image"><img></figure>
これを修正するために、次のコードを変更しました。
return { default: "data:image/png;base64," + image };
resolve();
に:
resolve({ default: image });