You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
6.2 KiB
197 lines
6.2 KiB
5 years ago
|
(function(global, factory) {
|
||
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||
|
typeof define === 'function' && define.amd ? define(factory) : (global.UploadClient = factory());
|
||
|
}(this, function() {
|
||
|
var calcPosition = function(width, height, opts) {
|
||
|
var isheight = width < height;
|
||
|
var scale = isheight ? height / width : width / height;
|
||
|
var zoom, x = 0,
|
||
|
y = 0,
|
||
|
w, h;
|
||
|
|
||
|
var gtScale = function() {
|
||
|
if (isheight) {
|
||
|
zoom = width / 100;
|
||
|
w = 100;
|
||
|
h = height / zoom;
|
||
|
y = (h - opts.maxHeight) / 2;
|
||
|
} else {
|
||
|
zoom = height / 100;
|
||
|
h = 100;
|
||
|
w = width / zoom;
|
||
|
x = (w - opts.maxWidth) / 2;
|
||
|
}
|
||
|
return {
|
||
|
w: w,
|
||
|
h: h,
|
||
|
x: -x,
|
||
|
y: -y
|
||
|
};
|
||
|
};
|
||
|
|
||
|
var ltScale = function() {
|
||
|
if (isheight) {
|
||
|
zoom = height / opts.maxHeight;
|
||
|
h = opts.maxHeight;
|
||
|
w = width / zoom;
|
||
|
} else {
|
||
|
zoom = width / opts.maxWidth;
|
||
|
w = opts.maxWidth;
|
||
|
h = height / zoom;
|
||
|
}
|
||
|
return {
|
||
|
w: w,
|
||
|
h: h,
|
||
|
x: -x,
|
||
|
y: -y
|
||
|
};
|
||
|
};
|
||
|
return scale > opts.scale ? gtScale() : ltScale();
|
||
|
};
|
||
|
|
||
|
var getBlobUrl = function(file) {
|
||
|
var URL = window.URL || window.webkitURL;
|
||
|
return URL ? URL.createObjectURL(file) : "";
|
||
|
};
|
||
|
|
||
|
var getThumbnail = function(file, opts, callback) {
|
||
|
var canvas = document.createElement("canvas"),
|
||
|
context = canvas.getContext('2d');
|
||
|
var img = new Image();
|
||
|
img.onload = function() {
|
||
|
var pos = calcPosition(img.width, img.height, opts);
|
||
|
canvas.width = pos.w > opts.maxWidth ? opts.maxWidth : pos.w;
|
||
|
canvas.height = pos.h > opts.maxHeight ? opts.maxHeight : pos.h;
|
||
|
context.drawImage(img, pos.x, pos.y, pos.w, pos.h);
|
||
|
try {
|
||
|
var base64 = canvas.toDataURL(file.type, opts.quality);
|
||
|
var reg = new RegExp('^data:image/[^;]+;base64,');
|
||
|
base64 = base64.replace(reg, '');
|
||
|
callback(base64);
|
||
|
} catch (e) {
|
||
|
throw new Error(e);
|
||
|
}
|
||
|
};
|
||
|
img.src = typeof file == 'string' ? 'data:image/jpg;base64,' + file : getBlobUrl(file);
|
||
|
};
|
||
|
|
||
|
var _compress = function(data, callback) {
|
||
|
var file = data.file;
|
||
|
var opts = data.compress;
|
||
|
getThumbnail(file, opts, callback);
|
||
|
};
|
||
|
|
||
|
_init = function(config, callback) {
|
||
|
if (config.getToken) {
|
||
|
config.getToken(function(token) {
|
||
|
config.multi_parmas || (config.multi_parmas = {});
|
||
|
config.multi_parmas.token = token;
|
||
|
config.headers || (config.headers = {});
|
||
|
if (config.base64) {
|
||
|
config.headers['Content-type'] = 'application/octet-stream';
|
||
|
config.headers['Authorization'] = 'UpToken ' + token;
|
||
|
}
|
||
|
var instance = UploadFile.init(config);
|
||
|
callback(instance);
|
||
|
});
|
||
|
} else {
|
||
|
config.headers || (config.headers = {});
|
||
|
if (config.base64) {
|
||
|
config.headers['Content-type'] = 'application/octet-stream';
|
||
|
}
|
||
|
var instance = UploadFile.init(config);
|
||
|
callback(instance);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var _upload = function(data, instance, callback) {
|
||
|
instance.upload(data.file, {
|
||
|
onError: function(errorCode) {
|
||
|
callback.onError(errorCode);
|
||
|
},
|
||
|
onProgress: function(loaded, total) {
|
||
|
callback.onProgress(loaded, total);
|
||
|
},
|
||
|
onCompleted: function(result) {
|
||
|
result.filename || (result.filename = result.hash);
|
||
|
var compress = data.compressThumbnail || _compress;
|
||
|
if (data.compress) {
|
||
|
compress(data, function(thumbnail) {
|
||
|
result.thumbnail = thumbnail;
|
||
|
callback.onCompleted(result);
|
||
|
});
|
||
|
} else {
|
||
|
callback.onCompleted(result);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
|
||
|
var File = function(instance) {
|
||
|
var me = this;
|
||
|
this.instance = instance
|
||
|
this.upload = function(file, callback) {
|
||
|
var data = {
|
||
|
file: file
|
||
|
};
|
||
|
_upload(data, me.instance, callback);
|
||
|
};
|
||
|
this.cancel = function() {
|
||
|
me.instance.cancel();
|
||
|
};
|
||
|
};
|
||
|
|
||
|
var initFile = function(config, callback) {
|
||
|
_init(config, function(instance) {
|
||
|
var uploadFile = new File(instance);
|
||
|
callback(uploadFile);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
var Img = function(instance, cfg) {
|
||
|
var me = this;
|
||
|
this.cfg = cfg;
|
||
|
this.instance = instance;
|
||
|
this.upload = function(file, callback) {
|
||
|
var data = {
|
||
|
file: file,
|
||
|
compress: me.cfg
|
||
|
};
|
||
|
_upload(data, me.instance, callback);
|
||
|
};
|
||
|
|
||
|
this.cancel = function() {
|
||
|
me.instance.cancel();
|
||
|
};
|
||
|
};
|
||
|
|
||
|
var initImage = function(config, callback) {
|
||
|
_init(config, function(instance) {
|
||
|
var compress = {
|
||
|
maxHeight: config.height || 240,
|
||
|
maxWidth: config.width || 240,
|
||
|
quality: config.quality || 0.5,
|
||
|
scale: config.scale || 2.4
|
||
|
};
|
||
|
var uploadImage = new Img(instance, compress);
|
||
|
callback(uploadImage);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
var ImgBase64 = function(config) {
|
||
|
config.base64 = true;
|
||
|
Img.call(this, config);
|
||
|
};
|
||
|
|
||
|
var initImgBase64 = function(config, callback) {
|
||
|
config.base64 = true;
|
||
|
initImage.call(this, config, callback);
|
||
|
};
|
||
|
|
||
|
return {
|
||
|
initFile: initFile,
|
||
|
initImage: initImage,
|
||
|
initImgBase64: initImgBase64,
|
||
|
dataType: UploadFile.dataType
|
||
|
};
|
||
|
}));
|