Задача загрузки файла на сервер тривиальна и рассматривается в любом пособии "для начинающих" в первых же главах. Но в то же время, организация удобного интерфейса загрузки является очень важным аспектом для любого web-приложения. Раньше для этого часто использовался flash, так как он позволял производить предварительную обработку изображений, сжатие, а также иллюстрирование хода загрузки.
С появлением HTML5, применение flash потеряло актуальность. И прогресс бары, иллюстрирующие ход загрузки файлов, и предварительную обработку изображений можно реализовать на новом технологическом стандарте. =)
В данной статье я расскажу о том, как реализовать предварительное сжатие изображения до отправки его на сервер.
Зачастую пользователь не думает о размере загружаемого им изображения и о том, сколько времени это может занять. И если изображение загружается долго, то пользователь просто считает сервис "тормознутым" и больше к нему не прибегает, хотя дело, конечно, не в сервисе. ;)
Предлагаю небольшую готовую функцию, которая пропорционально уменьшает изображение до указанного размера (по максимальной стороне).
function sendResized(file, maxWidth=0){
var reader = new FileReader();
reader.onload = function() {
// Если максимальный размер не задан, устанавливаем его 2000px
if (maxWidth == 0)
maxWidth = 2000;
var tempImg = new Image();
tempImg.src = reader.result;
tempImg.onload = function() {
// Расчитываем новые размеры изображения
var tempW = tempImg.width;
var tempH = tempImg.height;
if (tempW > tempH) {
if (tempW > maxWidth) {
tempH *= maxWidth / tempW;
tempW = maxWidth;
}
}else{
if (tempH > maxWidth) {
tempW *= maxWidth / tempH;
tempH = maxWidth;
}
}
tempW = Math.round(tempW);
tempH = Math.round(tempH);
// Создаем холст
var canvas = document.createElement('canvas');
canvas.width = tempW;
canvas.height = tempH;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0, tempW, tempH);
dataURL = canvas.toDataURL();
canvas.toBlob(function(blob) {
// Отправляем уменьшенное изображение на сервер
// Создаем объект типо FormData
var data = new FormData();
// Добавляем наше обработанное изображение
data.append('uploaded-file', blob);
// Отправляем на сервер
$.ajax({
url: 'upload.php',
data: data,
cache: false,
contentType: false,
processData: false,
type: 'POST',
success: function(data){
alert(data);
}
});
});
}
}
reader.readAsDataURL(file);
}
// ToBlob
(function(a){"use strict";var b=a.HTMLCanvasElement&&a.HTMLCanvasElement.prototype,c=function(){try{return!!(new Blob)}catch(a){return!1}}(),d=a.BlobBuilder||a.WebKitBlobBuilder||a.MozBlobBuilder||a.MSBlobBuilder,e=(c||d)&&a.atob&&a.ArrayBuffer&&a.Uint8Array&&function(a){var b,e,f,g,h,i;a.split(",")[0].indexOf("base64")>=0?b=atob(a.split(",")[1]):b=decodeURIComponent(a.split(",")[1]),e=new ArrayBuffer(b.length),f=new Uint8Array(e);for(g=0;g<b.length;g+=1)f[g]=b.charCodeAt(g);return i=a.split(",")[0].split(":")[1].split(";")[0],c?new Blob([e],{type:i}):(h=new d,h.append(e),h.getBlob(i))};a.HTMLCanvasElement&&!b.toBlob&&(b.mozGetAsFile?b.toBlob=function(a,b){a(this.mozGetAsFile("blob",b))}:b.toDataURL&&e&&(b.toBlob=function(a,b){a(e(this.toDataURL(b)))})),typeof define!="undefined"&&define.amd?define(function(){return e}):a.dataURLtoBlob=e})(this);

Комментарии