class MyUploadAdapter { constructor(loader) { this.loader = loader; this.url = ckeditorUploadUrl; // This is now set in Blade } upload() { return this.loader.file .then(file => new Promise((resolve, reject) => { const data = new FormData(); data.append('upload', file); data.append('_token', document.querySelector('meta[name="csrf-token"]').getAttribute('content')); fetch(this.url, { method: 'POST', body: data, credentials: 'same-origin', headers: { 'X-Requested-With': 'XMLHttpRequest' } }) .then(response => { if (!response.ok) { throw new Error('HTTP error ' + response.status); } return response.json(); }) .then(result => { if (result.url) { resolve({ default: result.url }); } else { reject('Upload failed'); console.error(result); } }) .catch(error => { reject('Upload failed'); console.error(error); }); })); } abort() {} } function MyCustomUploadAdapterPlugin(editor) { editor.plugins.get('FileRepository').createUploadAdapter = (loader) => { return new MyUploadAdapter(loader); }; } ClassicEditor .create(document.querySelector('#long_description'), { extraPlugins: [ MyCustomUploadAdapterPlugin ] }) .catch(error => { console.error(error); });