Я использую CKEDITOR5 и хочу, чтобы пользователи могли загружать изображения. Я использую настраиваемый адаптер загрузки, описанный на официальном сайте, но я не могу использовать XMLHttpRequest для загрузки изображений. Каждый раз, когда я загружаю изображение, появляется следующая ошибка: Доступ к XMLHttpRequest в 'https://xxxxxx' из источника 'http://xx.xx.xx.xx: xxxx' заблокирован политикой CORS: ответ на предварительный запрос не передает доступ контрольная проверка: в запрошенном ресурсе нет заголовка Access-Control-Allow-Origin. Я передаю изображение в бэкэнд и успешно загружаю его в s3, бэкэнд возвращает правильный URL-адрес s3, и я использую это как URL-адрес xhr.open ('POST', url, true) . Вот код моего индивидуального адаптера:
import axios from 'axios'
import { postAccessHeader, clearLocalStorage } from '../../common/publicFunc';
class MyUploadAdapter {
constructor( loader ) {
this.loader = loader;
this.url = '';
}
upload() {
return this.loader.file
.then( file => new Promise( ( resolve, reject ) => {
this._s3_upload_image( resolve, reject, file );
} ) );
}
abort() {
if ( this.xhr ) {
this.xhr.abort();
}
}
_initRequest( url ) {
const xhr = this.xhr = new XMLHttpRequest();
xhr.open( 'POST', url, true );
xhr.responseType = 'json';
}
_initListeners( resolve, reject, file ) {
const xhr = this.xhr;
const loader = this.loader;
const genericErrorText = `Couldn't upload file: ${ file.name }.`;
xhr.addEventListener( 'error', () => reject( genericErrorText ) );
xhr.addEventListener( 'abort', () => reject() );
xhr.addEventListener( 'load', () => {
const response = xhr.response;
if ( !response || response.error ) {
return reject( response && response.error ? response.error.message : genericErrorText );
}
resolve( {
default: response.url
} );
} );
if ( xhr.upload ) {
xhr.upload.addEventListener( 'progress', evt => {
if ( evt.lengthComputable ) {
loader.uploadTotal = evt.total;
loader.uploaded = evt.loaded;
}
} );
}
}
_sendRequest( file ) {
const data = new FormData();
data.append( 'upload', file );
this.xhr.send( data );
}
_s3_upload_image( resolve, reject, file ){
console.log(file)
const formData = new FormData();
formData.append( 'upload', file);
let payload = {"image": formData, "file": file, "test": "hi"}
console.log(payload)
let settings = postAccessHeader('/account/s3_upload_image', formData);
axios(settings)
.then(response => {
const code = response.status;
console.log(response)
if (code == 200) {
if (response.data.status) {
let url = response.data.url
this._initRequest( url );
this._initListeners( resolve, reject, file );
this._sendRequest( file );
} else {
if (response.data.AuthFailed) {
clearLocalStorage();
}
else {
}
}
} else {
alert("unable to upload image");
}
})
.catch(error => {
alert(error);
});
}
}
export default MyUploadAdapter
Спасибо за любую помощь!