123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669 |
- /*global plupload */
- /*global ActiveXObject */
- function QiniuJsSDK() {
- var _option = null;
- this.detectIEVersion = function() {
- var v = 4,
- div = document.createElement('div'),
- all = div.getElementsByTagName('i');
- while (
- div.innerHTML = '<!--[if gt IE ' + v + ']><i></i><![endif]-->',
- all[0]
- ) {
- v++;
- }
- return v > 4 ? v : false;
- };
- this.isImage = function(url) {
- var res, suffix = "";
- var imageSuffixes = ["png", "jpg", "jpeg", "gif", "bmp"];
- var suffixMatch = /\.([a-zA-Z0-9]+)(\?|\@|$)/;
- if (!url || !suffixMatch.test(url)) {
- return false;
- }
- res = suffixMatch.exec(url);
- suffix = res[1].toLowerCase();
- for (var i = 0, l = imageSuffixes.length; i < l; i++) {
- if (suffix === imageSuffixes[i]) {
- return true;
- }
- }
- return false;
- };
- this.utf8_encode = function(argString) {
- // http://kevin.vanzonneveld.net
- // + original by: Webtoolkit.info (http://www.webtoolkit.info/)
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + improved by: sowberry
- // + tweaked by: Jack
- // + bugfixed by: Onno Marsman
- // + improved by: Yves Sucaet
- // + bugfixed by: Onno Marsman
- // + bugfixed by: Ulrich
- // + bugfixed by: Rafal Kukawski
- // + improved by: kirilloid
- // + bugfixed by: kirilloid
- // * example 1: this.utf8_encode('Kevin van Zonneveld');
- // * returns 1: 'Kevin van Zonneveld'
- if (argString === null || typeof argString === 'undefined') {
- return '';
- }
- var string = (argString + ''); // .replace(/\r\n/g, '\n').replace(/\r/g, '\n');
- var utftext = '',
- start, end, stringl = 0;
- start = end = 0;
- stringl = string.length;
- for (var n = 0; n < stringl; n++) {
- var c1 = string.charCodeAt(n);
- var enc = null;
- if (c1 < 128) {
- end++;
- } else if (c1 > 127 && c1 < 2048) {
- enc = String.fromCharCode(
- (c1 >> 6) | 192, (c1 & 63) | 128
- );
- } else if (c1 & 0xF800 ^ 0xD800 > 0) {
- enc = String.fromCharCode(
- (c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128
- );
- } else { // surrogate pairs
- if (c1 & 0xFC00 ^ 0xD800 > 0) {
- throw new RangeError('Unmatched trail surrogate at ' + n);
- }
- var c2 = string.charCodeAt(++n);
- if (c2 & 0xFC00 ^ 0xDC00 > 0) {
- throw new RangeError('Unmatched lead surrogate at ' + (n - 1));
- }
- c1 = ((c1 & 0x3FF) << 10) + (c2 & 0x3FF) + 0x10000;
- enc = String.fromCharCode(
- (c1 >> 18) | 240, ((c1 >> 12) & 63) | 128, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128
- );
- }
- if (enc !== null) {
- if (end > start) {
- utftext += string.slice(start, end);
- }
- utftext += enc;
- start = end = n + 1;
- }
- }
- if (end > start) {
- utftext += string.slice(start, stringl);
- }
- return utftext;
- };
- this.base64_encode = function(data) {
- // http://kevin.vanzonneveld.net
- // + original by: Tyler Akins (http://rumkin.com)
- // + improved by: Bayron Guevara
- // + improved by: Thunder.m
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + bugfixed by: Pellentesque Malesuada
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // - depends on: this.utf8_encode
- // * example 1: this.base64_encode('Kevin van Zonneveld');
- // * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
- // mozilla has this native
- // - but breaks in 2.0.0.12!
- //if (typeof this.window['atob'] == 'function') {
- // return atob(data);
- //}
- var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
- var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
- ac = 0,
- enc = '',
- tmp_arr = [];
- if (!data) {
- return data;
- }
- data = this.utf8_encode(data + '');
- do { // pack three octets into four hexets
- o1 = data.charCodeAt(i++);
- o2 = data.charCodeAt(i++);
- o3 = data.charCodeAt(i++);
- bits = o1 << 16 | o2 << 8 | o3;
- h1 = bits >> 18 & 0x3f;
- h2 = bits >> 12 & 0x3f;
- h3 = bits >> 6 & 0x3f;
- h4 = bits & 0x3f;
- // use hexets to index into b64, and append result to encoded string
- tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
- } while (i < data.length);
- enc = tmp_arr.join('');
- switch (data.length % 3) {
- case 1:
- enc = enc.slice(0, -2) + '==';
- break;
- case 2:
- enc = enc.slice(0, -1) + '=';
- break;
- }
- return enc;
- };
- this.URLSafeBase64Encode = function(v) {
- v = this.base64_encode(v);
- return v.replace(/\//g, '_').replace(/\+/g, '-');
- };
- this.createAjax = function(argument) {
- var xmlhttp = {};
- if (window.XMLHttpRequest) {
- xmlhttp = new XMLHttpRequest();
- } else {
- xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
- return xmlhttp;
- };
- this.parseJSON = function(data) {
- // Attempt to parse using the native JSON parser first
- if (window.JSON && window.JSON.parse) {
- return window.JSON.parse(data);
- }
- if (data === null) {
- return data;
- }
- if (typeof data === "string") {
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = this.trim(data);
- if (data) {
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, "@").replace(/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
- return (new Function("return " + data))();
- }
- }
- }
- };
- this.trim = function(text) {
- return text === null ? "" : this.trim.call(text);
- };
- //Todo ie7 handler / this.parseJSON bug;
- var that = this;
- this.uploader = function(op) {
- if (!op.uptoken_url || !op.domain) {
- throw 'uptoken_url or domain is required!';
- }
- _option = op;
- if (!op.browse_button) {
- throw 'browse_button is required!';
- }
- var option = {};
- var Error_Handler = op.init && op.init.Error;
- var FileUploaded_Handler = op.init && op.init.FileUploaded;
- op.init.Error = function() {};
- op.init.FileUploaded = function() {};
- var uptoken_url = op.uptoken_url;
- this.domain = op.domain;
- var ie = that.detectIEVersion();
- if (ie && ie <= 9 && op.chunk_size && op.runtimes.indexOf('flash') >= 0) {
- /*
- link: http://www.plupload.com/docs/Frequently-Asked-Questions#when-to-use-chunking-and-when-not
- when plupload chunk_size setting is't null ,it cause bug in ie8/9 which runs flash runtimes (not support html5) .
- */
- op.chunk_size = 0;
- } else {
- var BLOCK_BITS = 20;
- var MAX_CHUNK_SIZE = 4 << BLOCK_BITS; //4M
- var chunk_size = plupload.parseSize(op.chunk_size);
- if (chunk_size > MAX_CHUNK_SIZE) {
- op.chunk_size = MAX_CHUNK_SIZE;
- }
- //qiniu service max_chunk_size is 4m
- //reset chunk_size to max_chunk_size(4m) when chunk_size > 4m
- }
- var token = '';
- var ctx = '';
- plupload.extend(option, op, {
- url: 'http://up.qiniu.com',
- multipart_params: {
- token: ''
- }
- });
- var uploader = new plupload.Uploader(option);
- var getUpToken = function() {
- var ajax = that.createAjax();
- ajax.open('GET', uptoken_url, true);
- ajax.setRequestHeader("If-Modified-Since", "0");
- ajax.onreadystatechange = function() {
- if (ajax.readyState === 4 && ajax.status === 200) {
- var res = that.parseJSON(ajax.responseText);
- token = res.uptoken;
- }
- };
- ajax.send();
- };
- uploader.bind('Init', function(up, params) {
- getUpToken();
- });
- uploader.init();
- uploader.bind('FilesAdded', function(up, files) {
- if (up.getOption('auto_start')) {
- $.each(files, function(i, file) {
- up.start();
- });
- }
- up.refresh(); // Reposition Flash/Silverlight
- });
- uploader.bind('BeforeUpload', function(up, file) {
- ctx = '';
- function directUpload() {
- up.setOption({
- 'url': 'http://up.qiniu.com/',
- 'multipart': true,
- 'chunk_size': undefined,
- 'multipart_params': {
- 'token': token,
- 'key': file.name
- }
- });
- }
- var chunk_size = up.getOption('chunk_size');
- if (uploader.runtime === 'html5' && chunk_size) {
- if (file.size < chunk_size) {
- directUpload();
- } else {
- var blockSize = chunk_size;
- ctx = '';
- up.setOption({
- 'url': 'http://up.qiniu.com/mkblk/' + blockSize,
- 'multipart': false,
- 'chunk_size': chunk_size,
- 'headers': {
- 'Authorization': 'UpToken ' + token
- },
- 'multipart_params': {}
- });
- }
- } else {
- directUpload();
- }
- });
- uploader.bind('ChunkUploaded', function(up, file, info) {
- var res = that.parseJSON(info.response);
- ctx = ctx ? ctx + ',' + res.ctx : res.ctx;
- var leftSize = info.total - info.offset;
- var chunk_size = up.getOption('chunk_size');
- if (leftSize < chunk_size) {
- up.setOption({
- 'url': 'http://up.qiniu.com/mkblk/' + leftSize
- });
- }
- });
- uploader.bind('Error', (function(Error_Handler) {
- return function(up, err) {
- var errTip = '';
- var file = err.file;
- if (file) {
- switch (err.code) {
- case plupload.FAILED:
- errTip = '上传失败。请稍后再试。';
- break;
- case plupload.FILE_SIZE_ERROR:
- errTip = '浏览器最大可上传' + up.getOption('max_file_size') + '。更大文件请使用命令行工具。';
- break;
- case plupload.FILE_EXTENSION_ERROR:
- errTip = '文件验证失败。请稍后重试。';
- break;
- case plupload.HTTP_ERROR:
- var errorObj = that.parseJSON(err.response);
- var errorText = errorObj.error;
- switch (err.status) {
- case 400:
- errTip = "请求报文格式错误。";
- break;
- case 401:
- errTip = "客户端认证授权失败。请重试或提交反馈。";
- break;
- case 405:
- errTip = "客户端请求错误。请重试或提交反馈。";
- break;
- case 579:
- errTip = "资源上传成功,但回调失败。";
- break;
- case 599:
- errTip = "网络连接异常。请重试或提交反馈。";
- break;
- case 614:
- errTip = "文件已存在。";
- errorObj = that.parseJSON(errorObj.error);
- errorText = errorObj.error || 'file exists';
- break;
- case 631:
- errTip = "指定空间不存在。";
- break;
- case 701:
- errTip = "上传数据块校验出错。请重试或提交反馈。";
- break;
- default:
- errTip = "未知错误。";
- break;
- }
- errTip = errTip + '(' + err.status + ':' + errorText + ')';
- break;
- case plupload.SECURITY_ERROR:
- errTip = '安全配置错误。请联系网站管理员。';
- break;
- case plupload.GENERIC_ERROR:
- errTip = '上传失败。请稍后再试。';
- break;
- case plupload.IO_ERROR:
- errTip = '上传失败。请稍后再试。';
- break;
- case plupload.INIT_ERROR:
- errTip = '网站配置错误。请联系网站管理员。';
- uploader.destroy();
- break;
- default:
- errTip = err.message + err.details;
- break;
- }
- if (Error_Handler) {
- Error_Handler(up, err, errTip);
- }
- } else {
- }
- up.refresh(); // Reposition Flash/Silverlight
- };
- })(Error_Handler));
- uploader.bind('FileUploaded', (function(FileUploaded_Handler) {
- return function(up, file, info) {
- var res = that.parseJSON(info.response);
- ctx = ctx ? ctx : res.ctx;
- if (ctx) {
- var url = 'http://up.qiniu.com/mkfile/' + file.size + '/key/' + that.URLSafeBase64Encode(file.name);
- var ajax = that.createAjax();
- ajax.open('POST', url, true);
- ajax.setRequestHeader('Content-Type', 'text/plain;charset=UTF-8');
- ajax.setRequestHeader('Authorization', 'UpToken ' + token);
- ajax.send(ctx);
- ajax.onreadystatechange = function() {
- if (ajax.readyState === 4) {
- if (ajax.status === 200) {
- var info = ajax.responseText;
- if (FileUploaded_Handler) {
- FileUploaded_Handler(up, file, info);
- }
- } else {
- uploader.trigger('Error', {
- status: ajax.status,
- response: ajax.responseText,
- file: file,
- code: -200
- });
- }
- }
- };
- } else {
- if (FileUploaded_Handler) {
- FileUploaded_Handler(up, file, info.response);
- }
- }
- };
- })(FileUploaded_Handler));
- return uploader;
- };
- this.getUrl = function(key) {
- if (!key) {
- return false;
- }
- key = encodeURI(key);
- var domain = _option.domain;
- if (domain.slice(domain.length - 1) !== '/') {
- domain = domain + '/';
- }
- return domain + key;
- };
- this.imageView2 = function(op, key) {
- var mode = op.mode || '',
- w = op.w || '',
- h = op.h || '',
- q = op.quality || '',
- format = op.format || '';
- if (!mode) {
- return false;
- }
- if (!w && !h) {
- return false;
- }
- var imageUrl = 'imageView2/' + mode;
- imageUrl += w ? '/w/' + w : '';
- imageUrl += h ? '/h/' + h : '';
- imageUrl += q ? '/q/' + q : '';
- imageUrl += format ? '/format/' + format : '';
- if (key) {
- imageUrl = this.getUrl(key) + '?' + imageUrl;
- }
- return imageUrl;
- };
- this.imageMogr2 = function(op, key) {
- var auto_orient = op['auto-orient'] || '',
- thumbnail = op.thumbnail || '',
- strip = op.strip || '',
- gravity = op.gravity || '',
- crop = op.crop || '',
- quality = op.quality || '',
- rotate = op.rotate || '',
- format = op.format || '',
- blur = op.blur || '';
- //Todo check option
- var imageUrl = 'imageMogr2';
- imageUrl += auto_orient ? '/auto-orient' : '';
- imageUrl += thumbnail ? '/thumbnail/' + thumbnail : '';
- imageUrl += strip ? '/strip' : '';
- imageUrl += gravity ? '/gravity/' + gravity : '';
- imageUrl += quality ? '/quality/' + quality : '';
- imageUrl += crop ? '/crop/' + crop : '';
- imageUrl += rotate ? '/rotate/' + rotate : '';
- imageUrl += format ? '/format/' + format : '';
- imageUrl += blur ? '/blur/' + blur : '';
- if (key) {
- imageUrl = this.getUrl(key) + '?' + imageUrl;
- }
- return imageUrl;
- };
- this.watermark = function(op, key) {
- var mode = op.mode;
- if (!mode) {
- return false;
- }
- var imageUrl = 'watermark/' + mode;
- if (mode === 1) {
- var image = op.image || '';
- if (!image) {
- return false;
- }
- imageUrl += image ? '/image/' + this.URLSafeBase64Encode(image) : '';
- } else if (mode === 2) {
- var text = op.text ? op.text : '',
- font = op.font ? op.font : '',
- fontsize = op.fontsize ? op.fontsize : '',
- fill = op.fill ? op.fill : '';
- if (!text) {
- return false;
- }
- imageUrl += text ? '/text/' + this.URLSafeBase64Encode(text) : '';
- imageUrl += font ? '/font/' + this.URLSafeBase64Encode(font) : '';
- imageUrl += fontsize ? '/fontsize/' + fontsize : '';
- imageUrl += fill ? '/fill/' + this.URLSafeBase64Encode(fill) : '';
- } else {
- // Todo mode3
- return false;
- }
- var dissolve = op.dissolve || '',
- gravity = op.gravity || '',
- dx = op.dx || '',
- dy = op.dy || '';
- imageUrl += dissolve ? '/dissolve/' + dissolve : '';
- imageUrl += gravity ? '/gravity/' + gravity : '';
- imageUrl += dx ? '/dx/' + dx : '';
- imageUrl += dy ? '/dy/' + dy : '';
- if (key) {
- imageUrl = this.getUrl(key) + '?' + imageUrl;
- }
- return imageUrl;
- };
- this.imageInfo = function(key) {
- if (!key) {
- return false;
- }
- var url = this.getUrl(key) + '?imageInfo';
- var xhr = this.createAjax();
- var info;
- var that = this;
- xhr.open('GET', url, false);
- xhr.onreadystatechange = function() {
- if (xhr.readyState === 4 && xhr.status === 200) {
- info = that.parseJSON(xhr.responseText);
- }
- };
- xhr.send();
- return info;
- };
- this.exif = function(key) {
- if (!key) {
- return false;
- }
- var url = this.getUrl(key) + '?exif';
- var xhr = this.createAjax();
- var info;
- var that = this;
- xhr.open('GET', url, false);
- xhr.onreadystatechange = function() {
- if (xhr.readyState === 4 && xhr.status === 200) {
- info = that.parseJSON(xhr.responseText);
- }
- };
- xhr.send();
- return info;
- };
- this.get = function(type, key) {
- if (!key || !type) {
- return false;
- }
- if (type === 'exif') {
- return this.exif(key);
- } else if (type === 'imageInfo') {
- return this.imageInfo(key);
- }
- return false;
- };
- this.pipeline = function(arr, key) {
- var isArray = Object.prototype.toString.call(arr) === '[object Array]';
- var option, errOp, imageUrl = '';
- if (isArray) {
- for (var i = 0, len = arr.length; i < len; i++) {
- option = arr[i];
- if (!option.fop) {
- return false;
- }
- switch (option.fop) {
- case 'watermark':
- imageUrl += this.watermark(option) + '|';
- break;
- case 'imageView2':
- imageUrl += this.imageView2(option) + '|';
- break;
- case 'imageMogr2':
- imageUrl += this.imageMogr2(option) + '|';
- break;
- default:
- errOp = true;
- break;
- }
- if (errOp) {
- return false;
- }
- }
- if (key) {
- imageUrl = this.getUrl(key) + '?' + imageUrl;
- var length = imageUrl.length;
- if (imageUrl.slice(length - 1) === '|') {
- imageUrl = imageUrl.slice(0, length - 1);
- }
- }
- return imageUrl;
- }
- return false;
- };
- }
- var Qiniu = new QiniuJsSDK();
|