Files
klangkarte/backend/common/static/admin/tinymce-upload.js
2024-06-27 22:41:39 +02:00

56 lines
1.8 KiB
JavaScript

function tinymce_image_upload_handler(blobInfo, progress) {
return new Promise((resolve, reject) => {
const match = self.location.pathname.match('/app/place/([0-9]*)/');
if (!match) {
return reject('Cannot match place id from URL.');
}
// FIXME: this will still upload the image as base64 string
// if (blobInfo.blob().size > 1_000_000) { // >1MB
// return reject('Image too large. Max file size: 1 MB');
// }
const placeId = match[1];
let xhr, formData;
// token = Cookies.get("csrftoken");
token = document.cookie.match('csrftoken=([^;]*)')[1];
xhr = new XMLHttpRequest();
xhr.withCredentials = false;
xhr.open('POST', '/tinymce/upload/' + placeId + '/');
xhr.setRequestHeader('X-CSRFToken', token);
if (progress) {
xhr.upload.onprogress = function (e) {
progress(e.loaded / e.total * 100);
};
}
xhr.onload = function () {
let json;
if (xhr.status === 403) {
return reject('HTTP Error: ' + xhr.status, { remove: true });
}
if (xhr.status < 200 || xhr.status >= 300) {
return reject('HTTP Error: ' + xhr.status);
}
json = JSON.parse(xhr.responseText);
if (!json || typeof json.location != 'string') {
return reject('Invalid JSON: ' + xhr.responseText);
}
return resolve(json.location);
};
xhr.onerror = function () {
return reject('Image upload failed due to a XHR Transport error. Code: ' + xhr.status);
};
formData = new FormData();
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
});
}