With Base64 image upload adapter, CKEditor encoding image obviously, to Base64 format, and inserts the result as <img src="data:image/png;base64, code... >. The code could be very long; I want uploaded image URL instead.
In my application, I need below functionality:
- Convert image to Base64. I know how to do it basically:
async function encodeSingleFileTo64base(targetFile: File): Promise<string> {
const fileReader: FileReader = new FileReader();
fileReader.readAsDataURL(targetFile);
return new Promise<string>((resolve: (encodedFile: string) => void, reject: (error: Error) => void): void => {
fileReader.onload = (filedHasBeenReadEvent: ProgressEvent<FileReader>): void => {
if (filedHasBeenReadEvent.target === null || filedHasBeenReadEvent.target.result === null) {
reject(new Error("Failed to encode the image file."));
return;
}
resolve(String(filedHasBeenReadEvent.target.result));
};
});
}
- Submit Base64 code by GraphQL. I can do it basically:
import AWSAmplifyAPI, { graphqlOperation, GraphQLResult } from "@aws-amplify/api";
async function uploadPhotoAndGetURL(photoBase64: string): Promise<string> {
return (await AWSAmplifyAPI.graphql(graphqlOperation(
`mutation($photoBase64: String!) { uploadPhoto(photoBase64: $photoBase64) }`,
{ photoBase64 }
))).uploadPhoto;
}
- Make CK Editor to add received from response URL to
src=""(it is the subject of current question).
Here is the solution template from documentation:
class MyUploadAdapter {
constructor( loader ) {
this.loader = loader;
}
upload() {
return loader.file
.then( file => server.upload( file ) );
}
abort() {
server.abortUpload();
}
}
First problem: how to chain two async functions in upload() method?
Both encoding and data submitting are async operations.
I has been confused how to do it compatibly with loader.file.then().
Second problem: how to pass recieved URL to CK editor?
I can not undestand from suggested solution template how we can receive uploaded image URL and pass it to src attribute.