Да, это возможно.
Прямые загрузки обрабатываются классом DirectUpload
(или ActiveStorage.DirectUpload
в зависимости от того, как вы обращаетесь к вещам). Обычно DirectUpload
хочет, чтобы File
считывал изображение, но достаточно удобно, File
- это Blob
, так что вы можете использовать вместо него Blob
. Active Storage требует только несколько вещей из своего «файла», и почти все эти вещи присутствуют в Blob
, единственная недостающая вещь - это свойство name
, и вы можете добавить это самостоятельно.
Так что теперь нам нужно вытащить Blob
из холста. Это на самом деле довольно просто, потому что у холстов есть toBlob
метод :
Метод HTMLCanvasElement.toBlob()
создает объект Blob
, представляющий изображение, содержащееся на холсте; этот файл может быть кэширован на диске или сохранен в памяти по усмотрению агента пользователя.
Сначала настройте прямую загрузку как обычно . Затем добавьте свой собственный обработчик отправки для общей формы, который будет выглядеть примерно так:
const form = your_form_element;
const canvas = your_canvas_element;
const input = your_file_input;
canvas.toBlob(blob => {
// Fake out DirectUpload by manually adding a name.
blob.name = input.files[0].name;
const uploader = new DirectUpload(blob, input.dataset.directUploadUrl);
uploader.create((error, blob) => {
if(error) {
// Handle the error.
}
else {
// Add the <input type="hidden"> with the signature.
const hiddenField = document.createElement('input')
hiddenField.setAttribute('type', 'hidden');
hiddenField.setAttribute('value', blob.signed_id);
form.appendChild(hiddenField);
// And submit away...
form.submit();
}
});
}, 'image/jpeg', 0.95);
Предполагается, что вы хотите JPEG, вы можете использовать другие типы контента, если хотите, или можете сопоставить его с оригиналом. Я также пропустил некоторые из стандартных шаблонов обработчиков отправки. Если вы установили обычные глобальные обработчики прямой загрузки, они будут использоваться здесь для индикатора выполнения и т. П .; если у вас их нет, вам придется справиться с этим самостоятельно, руководство, указанное выше, содержит указатели на все это.