Цель следующего кода - сжать входной файл (JPG-файл 2 МБ => 500 КБ файл), а затем загрузить его на сервер при отправке <form>
.
При импорте изображения из файла JPG на холст и его экспорте с помощью toDataURL
с помощью:
function doit() {
var file = document.getElementById('file').files[0],
canvas = document.getElementById('canvas'),
hidden = document.getElementById('hidden'),
ctx = canvas.getContext("2d"),
img = document.createElement("img"),
reader = new FileReader();
reader.onload = function(e) {
img.src = e.target.result;
}
img.onload = function () {
ctx.drawImage(img, 0, 0);
hidden.value = canvas.toDataURL("image/jpeg", 0.5);
}
reader.readAsDataURL(file);
}
<input type="file" onchange="doit();" id="file" />
<form action="/upload" method="post">
<input type="hidden" id="hidden" />
<input type="submit" />
</form>
<canvas id="canvas" style="display: none" />
это работает, но поле hidden
вывода в <form>
закодировано в base64, то есть что-то вроде:
data:image/jpeg;base64,/9j/4AAQSkZJRgAB...
Хорошо известно, что base64 использует в 1,3333 раза больше нормального размера двоичных данных.
Вопрос: как в этом случае не тратить 1/3 данных на время загрузки (клиент => сервер) и пропускную способность, т. Е. При отправке <form>
?
Примечание: я думаю, что проблема будет той же, если я использую AJAX вместо <form>
представления, не так ли?