diff --git a/Makefile b/Makefile index b0350f15..3358325c 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ install : all all : + grunt node demo/server.js diff --git a/README.md b/README.md index 2bd88d6a..13928cc9 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,9 @@ qiniu-js-sdk var uploader = Qiniu.uploader({ runtimes: 'html5,flash,html4', //上传模式,依次退化 browse_button: 'pickfiles', //上传选择的点选按钮,**必需** - uptoken_url: '/token', //Ajax请求upToken的Url,**强烈建议设置**(服务端提供) + uptoken_url: '/uptoken', //Ajax请求upToken的Url,**强烈建议设置**(服务端提供) + // downtoken_url: '/downtoken', + // Ajax请求downToken的Url,私有空间时使用,JS-SDK将向该地址POST文件的key和domain,服务端返回的JSON必须包含`url`字段,`url`值为该文件的下载地址 // uptoken : '', //若未指定uptoken_url,则必须指定 uptoken ,uptoken由其他程序生成 // unique_names: true, // 默认 false,key为文件名。若开启该选项,SDK会为每个文件自动生成key(文件名) // save_key: true, // 默认 false。若在服务端生成uptoken的上传策略中指定了 `sava_key`,则开启,SDK在前端将不对key进行任何处理 @@ -301,6 +303,8 @@ qiniu-js-sdk * 安装 [Nodejs](http://nodejs.org/download/)、[npm](https://www.npmjs.org/) +* `npm install -g grunt-cli`,安装 Grunt + * `npm install`,安装七牛 Node.js SDK、Express * 获取源代码: @@ -316,12 +320,15 @@ qiniu-js-sdk 'ACCESS_KEY': '', 'SECRET_KEY': '', 'Bucket_Name': '', - 'Port': 18080 + 'Port': 18080, + 'Uptoken_Url': '', + 'Domain': '' } ``` -* 在`demo`目录运行`node server.js` 或者 在根目录运行`make`启动 +* 在根目录运行`make`启动 + * 访问`http://127.0.0.1:18080/`或`http://localhost:18080/` ## 说明 diff --git a/demo/config.js b/demo/config.js index d5baae05..3ce09cab 100644 --- a/demo/config.js +++ b/demo/config.js @@ -3,6 +3,6 @@ module.exports = { 'SECRET_KEY': '', 'Bucket_Name': '', 'Port': 18080, - 'Uptoken_Url': '/token', + 'Uptoken_Url': '/uptoken', 'Domain': 'http://qiniu-plupload.qiniudn.com/' -} +}; diff --git a/demo/js/main.js b/demo/js/main.js index 4f4eb6ea..67289d40 100644 --- a/demo/js/main.js +++ b/demo/js/main.js @@ -3,6 +3,7 @@ /*global FileProgress */ /*global hljs */ + $(function() { var uploader = Qiniu.uploader({ runtimes: 'html5,flash,html4', @@ -15,6 +16,7 @@ $(function() { chunk_size: '4mb', uptoken_url: $('#uptoken_url').val(), domain: $('#domain').val(), + // downtoken_url: '/downtoken', // unique_names: true, // save_key: true, // x_vars: { diff --git a/demo/js/ui.js b/demo/js/ui.js index dbc91990..e289dddf 100644 --- a/demo/js/ui.js +++ b/demo/js/ui.js @@ -190,11 +190,18 @@ FileProgress.prototype.setComplete = function(up, info) { var td = this.fileProgressWrapper.find('td:eq(2) .progress'); var res = $.parseJSON(info); - var domain = up.getOption('domain'); - var url = domain + encodeURI(res.key); - var link = domain + res.key; - var str = "" + - "
Hash:" + res.hash + "
"; + var url; + if (res.url) { + url = res.url; + str = "" + + "
Hash:" + res.hash + "
"; + } else { + var domain = up.getOption('domain'); + url = domain + encodeURI(res.key); + var link = domain + res.key; + str = "" + + "
Hash:" + res.hash + "
"; + } td.html(str).removeClass().next().next('.status').hide(); @@ -240,12 +247,14 @@ FileProgress.prototype.setComplete = function(up, info) { Wrapper.append(imgWrapper); var img = new Image(); - $(img).attr('src', url + imageView); + if (!/imageView/.test(url)) { + url += imageView + } + $(img).attr('src', url); var height_space = 340; $(img).on('load', function() { - - showImg.attr('src', url + imageView); + showImg.attr('src', url); linkWrapper.attr('href', url).attr('title', '查看原图'); diff --git a/demo/server.js b/demo/server.js index 8e953f38..49a899b9 100644 --- a/demo/server.js +++ b/demo/server.js @@ -7,16 +7,13 @@ app.configure(function() { app.use(express.static(__dirname + '/')); }); + app.set('views', __dirname + '/views'); app.engine('html', require('ejs').renderFile); +app.use(express.urlencoded()); -app.use(function(req, res, next) { - req.headers['if-none-match'] = 'no-match-for-this'; - next(); -}); - -app.get('/token', function(req, res, next) { +app.get('/uptoken', function(req, res, next) { var token = uptoken.token(); res.header("Cache-Control", "max-age=0, private, must-revalidate"); res.header("Pragma", "no-cache"); @@ -28,6 +25,40 @@ app.get('/token', function(req, res, next) { } }); +app.post('/downtoken', function(req, res) { + + var key = req.body.key, + domain = req.body.domain; + + //trim 'http://' + if (domain.indexOf('http://') != -1) { + domain = domain.substr(7); + } + //trim 'https://' + if (domain.indexOf('https://') != -1) { + domain = domain.substr(8); + } + //trim '/' if the domain's last char is '/' + if (domain.lastIndexOf('/') === domain.length - 1) { + domain = domain.substr(0, domain.length - 1); + } + + var baseUrl = qiniu.rs.makeBaseUrl(domain, key); + var deadline = 3600 + Math.floor(Date.now() / 1000); + + baseUrl += '?e=' + deadline; + var signature = qiniu.util.hmacSha1(baseUrl, config.SECRET_KEY); + var encodedSign = qiniu.util.base64ToUrlSafe(signature); + var downloadToken = config.ACCESS_KEY + ':' + encodedSign; + + if (downloadToken) { + res.json({ + downtoken: downloadToken, + url: baseUrl + '&token=' + downloadToken + }) + } +}); + app.get('/', function(req, res) { res.render('index.html', { domain: config.Domain, @@ -41,4 +72,6 @@ qiniu.conf.SECRET_KEY = config.SECRET_KEY; var uptoken = new qiniu.rs.PutPolicy(config.Bucket_Name); -app.listen(config.Port); +app.listen(config.Port, function() { + console.log('Listening on port %d', config.Port); +}); diff --git a/demo/views/index.html b/demo/views/index.html index 5d534128..5c7f6ad6 100644 --- a/demo/views/index.html +++ b/demo/views/index.html @@ -20,7 +20,7 @@

查看初始化代码 - + View Source on Github diff --git a/src/qiniu.js b/src/qiniu.js index 0051c191..d79ac217 100644 --- a/src/qiniu.js +++ b/src/qiniu.js @@ -451,7 +451,7 @@ function QiniuJsSDK() { errorObj = that.parseJSON(errorObj.error); errorText = errorObj.error || 'file exists'; } catch (e) { - // console.log(e); + throw ('invalid json format'); } break; case 631: @@ -493,6 +493,42 @@ function QiniuJsSDK() { uploader.bind('FileUploaded', (function(_FileUploaded_Handler) { return function(up, file, info) { + + var last_step = function(up, file, info) { + if (op.downtoken_url) { + var ajax_downtoken = that.createAjax(); + ajax_downtoken.open('POST', op.downtoken_url, true); + ajax_downtoken.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + ajax_downtoken.onreadystatechange = function() { + if (ajax_downtoken.readyState === 4) { + if (ajax_downtoken.status === 200) { + var res_downtoken; + try { + res_downtoken = that.parseJSON(ajax_downtoken.responseText); + } catch (e) { + throw ('invalid json format'); + } + var info_extended = {}; + plupload.extend(info_extended, that.parseJSON(info), res_downtoken); + if (_FileUploaded_Handler) { + _FileUploaded_Handler(up, file, JSON.stringify(info_extended)); + } + } else { + uploader.trigger('Error', { + status: ajax_downtoken.status, + response: ajax_downtoken.responseText, + file: file, + code: plupload.HTTP_ERROR + }); + } + } + }; + ajax_downtoken.send('key=' + that.parseJSON(info).key + '&domain=' + op.domain); + } else if (_FileUploaded_Handler) { + _FileUploaded_Handler(up, file, info); + } + }; + var res = that.parseJSON(info.response); ctx = ctx ? ctx : res.ctx; if (ctx) { @@ -523,15 +559,11 @@ function QiniuJsSDK() { ajax.open('POST', url, true); ajax.setRequestHeader('Content-Type', 'text/plain;charset=UTF-8'); ajax.setRequestHeader('Authorization', 'UpToken ' + that.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); - } + last_step(up, file, info); } else { uploader.trigger('Error', { @@ -543,10 +575,9 @@ function QiniuJsSDK() { } } }; + ajax.send(ctx); } else { - if (_FileUploaded_Handler) { - _FileUploaded_Handler(up, file, info.response); - } + last_step(up, file, info.response); } }; diff --git a/src/qiniu.min.js b/src/qiniu.min.js index e1fd539a..5e66dfab 100644 --- a/src/qiniu.min.js +++ b/src/qiniu.min.js @@ -1 +1 @@ -function QiniuJsSDK(){this.detectIEVersion=function(){for(var a=4,b=document.createElement("div"),c=b.getElementsByTagName("i");b.innerHTML="",c[0];)a++;return a>4?a:!1},this.isImage=function(a){var b,c="",d=["png","jpg","jpeg","gif","bmp"],e=/\.([a-zA-Z0-9]+)(\?|\@|$)/;if(!a||!e.test(a))return!1;b=e.exec(a),c=b[1].toLowerCase();for(var f=0,g=d.length;g>f;f++)if(c===d[f])return!0;return!1},this.getFileExtension=function(a){var b,c=a.split(".");return b=1===c.length||""===c[0]&&2===c.length?"":c.pop().toLowerCase()},this.utf8_encode=function(a){if(null===a||"undefined"==typeof a)return"";var b,c,d=a+"",e="",f=0;b=c=0,f=d.length;for(var g=0;f>g;g++){var h=d.charCodeAt(g),i=null;if(128>h)c++;else if(h>127&&2048>h)i=String.fromCharCode(h>>6|192,63&h|128);else if(63488&h^!0)i=String.fromCharCode(h>>12|224,h>>6&63|128,63&h|128);else{if(64512&h^!0)throw new RangeError("Unmatched trail surrogate at "+g);var j=d.charCodeAt(++g);if(64512&j^!0)throw new RangeError("Unmatched lead surrogate at "+(g-1));h=((1023&h)<<10)+(1023&j)+65536,i=String.fromCharCode(h>>18|240,h>>12&63|128,h>>6&63|128,63&h|128)}null!==i&&(c>b&&(e+=d.slice(b,c)),e+=i,b=c=g+1)}return c>b&&(e+=d.slice(b,f)),e},this.base64_encode=function(a){var b,c,d,e,f,g,h,i,j="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",k=0,l=0,m="",n=[];if(!a)return a;a=this.utf8_encode(a+"");do b=a.charCodeAt(k++),c=a.charCodeAt(k++),d=a.charCodeAt(k++),i=b<<16|c<<8|d,e=i>>18&63,f=i>>12&63,g=i>>6&63,h=63&i,n[l++]=j.charAt(e)+j.charAt(f)+j.charAt(g)+j.charAt(h);while(k=f&&b.chunk_size&&b.runtimes.indexOf("flash")>=0?b.chunk_size=0:(c=20,d=4<d&&(b.chunk_size=d))};g();var h=function(){if(b.uptoken)a.token=b.uptoken;else{var c=a.createAjax();c.open("GET",a.uptoken_url,!0),c.setRequestHeader("If-Modified-Since","0"),c.onreadystatechange=function(){if(4===c.readyState&&200===c.status){var b=a.parseJSON(c.responseText);a.token=b.uptoken}},c.send()}},i=function(c,d,e){var f="",g=!1;if(!b.save_key)if(g=c.getOption&&c.getOption("unique_names"),g=g||c.settings&&c.settings.unique_names){var h=a.getFileExtension(d.name);f=h?d.id+"."+h:d.id}else f="function"==typeof e?e(c,d):d.name;return f};plupload.extend(c,b,{url:"http://up.qiniu.com",multipart_params:{token:""}});var j=new plupload.Uploader(c);return j.bind("Init",function(){h()}),j.init(),j.bind("FilesAdded",function(a,b){var c=a.getOption&&a.getOption("auto_start");c=c||a.settings&&a.settings.auto_start,c&&$.each(b,function(){a.start()}),a.refresh()}),j.bind("BeforeUpload",function(c,d){f="";var e=function(c,d,e){var f;f=b.save_key?{token:a.token}:{key:i(c,d,e),token:a.token};var g=b.x_vars;if(void 0!==g&&"object"==typeof g)for(var h in g)g.hasOwnProperty(h)&&("function"==typeof g[h]?f["x:"+h]=g[h](c,d):"object"!=typeof g[h]&&(f["x:"+h]=g[h]));c.setOption({url:"http://up.qiniu.com/",multipart:!0,chunk_size:void 0,multipart_params:f})},g=c.getOption&&c.getOption("chunk_size");if(g=g||c.settings&&c.settings.chunk_size,"html5"===j.runtime&&g)if(d.sizeg&&b.setOption({url:"http://up.qiniu.com/mkblk/"+g})}),j.bind("Error",function(b){return function(c,d){var e="",f=d.file;if(f){switch(d.code){case plupload.FAILED:e="上传失败。请稍后再试。";break;case plupload.FILE_SIZE_ERROR:var g=c.getOption&&c.getOption("max_file_size");g=g||c.settings&&c.settings.max_file_size,e="浏览器最大可上传"+g+"。更大文件请使用命令行工具。";break;case plupload.FILE_EXTENSION_ERROR:e="文件验证失败。请稍后重试。";break;case plupload.HTTP_ERROR:var h=a.parseJSON(d.response),i=h.error;switch(d.status){case 400:e="请求报文格式错误。";break;case 401:e="客户端认证授权失败。请重试或提交反馈。";break;case 405:e="客户端请求错误。请重试或提交反馈。";break;case 579:e="资源上传成功,但回调失败。";break;case 599:e="网络连接异常。请重试或提交反馈。";break;case 614:e="文件已存在。";try{h=a.parseJSON(h.error),i=h.error||"file exists"}catch(k){}break;case 631:e="指定空间不存在。";break;case 701:e="上传数据块校验出错。请重试或提交反馈。";break;default:e="未知错误。"}e=e+"("+d.status+":"+i+")";break;case plupload.SECURITY_ERROR:e="安全配置错误。请联系网站管理员。";break;case plupload.GENERIC_ERROR:e="上传失败。请稍后再试。";break;case plupload.IO_ERROR:e="上传失败。请稍后再试。";break;case plupload.INIT_ERROR:e="网站配置错误。请联系网站管理员。",j.destroy();break;default:e=d.message+d.details}b&&b(c,d,e)}c.refresh()}}(d)),j.bind("FileUploaded",function(c){return function(d,e,g){var h=a.parseJSON(g.response);if(f=f?f:h.ctx){var k="";b.save_key||(k=i(d,e,a.key_handler),k=k?"/key/"+a.URLSafeBase64Encode(k):"");var l=b.x_vars,m="",n="";if(void 0!==l&&"object"==typeof l)for(var o in l)l.hasOwnProperty(o)&&("function"==typeof l[o]?m=a.URLSafeBase64Encode(l[o](d,e)):"object"!=typeof l[o]&&(m=a.URLSafeBase64Encode(l[o])),n+="/x:"+o+"/"+m);var p="http://up.qiniu.com/mkfile/"+e.size+k+n,q=a.createAjax();q.open("POST",p,!0),q.setRequestHeader("Content-Type","text/plain;charset=UTF-8"),q.setRequestHeader("Authorization","UpToken "+a.token),q.send(f),q.onreadystatechange=function(){if(4===q.readyState)if(200===q.status){var a=q.responseText;c&&c(d,e,a)}else j.trigger("Error",{status:q.status,response:q.responseText,file:e,code:-200})}}else c&&c(d,e,g.response)}}(e)),j},this.getUrl=function(a){if(!a)return!1;a=encodeURI(a);var b=this.domain;return"/"!==b.slice(b.length-1)&&(b+="/"),b+a},this.imageView2=function(a,b){var c=a.mode||"",d=a.w||"",e=a.h||"",f=a.quality||"",g=a.format||"";if(!c)return!1;if(!d&&!e)return!1;var h="imageView2/"+c;return h+=d?"/w/"+d:"",h+=e?"/h/"+e:"",h+=f?"/q/"+f:"",h+=g?"/format/"+g:"",b&&(h=this.getUrl(b)+"?"+h),h},this.imageMogr2=function(a,b){var c=a["auto-orient"]||"",d=a.thumbnail||"",e=a.strip||"",f=a.gravity||"",g=a.crop||"",h=a.quality||"",i=a.rotate||"",j=a.format||"",k=a.blur||"",l="imageMogr2";return l+=c?"/auto-orient":"",l+=d?"/thumbnail/"+d:"",l+=e?"/strip":"",l+=f?"/gravity/"+f:"",l+=h?"/quality/"+h:"",l+=g?"/crop/"+g:"",l+=i?"/rotate/"+i:"",l+=j?"/format/"+j:"",l+=k?"/blur/"+k:"",b&&(l=this.getUrl(b)+"?"+l),l},this.watermark=function(a,b){var c=a.mode;if(!c)return!1;var d="watermark/"+c;if(1===c){var e=a.image||"";if(!e)return!1;d+=e?"/image/"+this.URLSafeBase64Encode(e):""}else{if(2!==c)return!1;var f=a.text?a.text:"",g=a.font?a.font:"",h=a.fontsize?a.fontsize:"",i=a.fill?a.fill:"";if(!f)return!1;d+=f?"/text/"+this.URLSafeBase64Encode(f):"",d+=g?"/font/"+this.URLSafeBase64Encode(g):"",d+=h?"/fontsize/"+h:"",d+=i?"/fill/"+this.URLSafeBase64Encode(i):""}var j=a.dissolve||"",k=a.gravity||"",l=a.dx||"",m=a.dy||"";return d+=j?"/dissolve/"+j:"",d+=k?"/gravity/"+k:"",d+=l?"/dx/"+l:"",d+=m?"/dy/"+m:"",b&&(d=this.getUrl(b)+"?"+d),d},this.imageInfo=function(a){if(!a)return!1;var b,c=this.getUrl(a)+"?imageInfo",d=this.createAjax(),e=this;return d.open("GET",c,!1),d.onreadystatechange=function(){4===d.readyState&&200===d.status&&(b=e.parseJSON(d.responseText))},d.send(),b},this.exif=function(a){if(!a)return!1;var b,c=this.getUrl(a)+"?exif",d=this.createAjax(),e=this;return d.open("GET",c,!1),d.onreadystatechange=function(){4===d.readyState&&200===d.status&&(b=e.parseJSON(d.responseText))},d.send(),b},this.get=function(a,b){return b&&a?"exif"===a?this.exif(b):"imageInfo"===a?this.imageInfo(b):!1:!1},this.pipeline=function(a,b){var c,d,e="[object Array]"===Object.prototype.toString.call(a),f="";if(e){for(var g=0,h=a.length;h>g;g++){if(c=a[g],!c.fop)return!1;switch(c.fop){case"watermark":f+=this.watermark(c)+"|";break;case"imageView2":f+=this.imageView2(c)+"|";break;case"imageMogr2":f+=this.imageMogr2(c)+"|";break;default:d=!0}if(d)return!1}if(b){f=this.getUrl(b)+"?"+f;var i=f.length;"|"===f.slice(i-1)&&(f=f.slice(0,i-1))}return f}return!1}}var Qiniu=new QiniuJsSDK; \ No newline at end of file +function QiniuJsSDK(){this.detectIEVersion=function(){for(var a=4,b=document.createElement("div"),c=b.getElementsByTagName("i");b.innerHTML="",c[0];)a++;return a>4?a:!1},this.isImage=function(a){var b,c="",d=["png","jpg","jpeg","gif","bmp"],e=/\.([a-zA-Z0-9]+)(\?|\@|$)/;if(!a||!e.test(a))return!1;b=e.exec(a),c=b[1].toLowerCase();for(var f=0,g=d.length;g>f;f++)if(c===d[f])return!0;return!1},this.getFileExtension=function(a){var b,c=a.split(".");return b=1===c.length||""===c[0]&&2===c.length?"":c.pop().toLowerCase()},this.utf8_encode=function(a){if(null===a||"undefined"==typeof a)return"";var b,c,d=a+"",e="",f=0;b=c=0,f=d.length;for(var g=0;f>g;g++){var h=d.charCodeAt(g),i=null;if(128>h)c++;else if(h>127&&2048>h)i=String.fromCharCode(h>>6|192,63&h|128);else if(63488&h^!0)i=String.fromCharCode(h>>12|224,h>>6&63|128,63&h|128);else{if(64512&h^!0)throw new RangeError("Unmatched trail surrogate at "+g);var j=d.charCodeAt(++g);if(64512&j^!0)throw new RangeError("Unmatched lead surrogate at "+(g-1));h=((1023&h)<<10)+(1023&j)+65536,i=String.fromCharCode(h>>18|240,h>>12&63|128,h>>6&63|128,63&h|128)}null!==i&&(c>b&&(e+=d.slice(b,c)),e+=i,b=c=g+1)}return c>b&&(e+=d.slice(b,f)),e},this.base64_encode=function(a){var b,c,d,e,f,g,h,i,j="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",k=0,l=0,m="",n=[];if(!a)return a;a=this.utf8_encode(a+"");do b=a.charCodeAt(k++),c=a.charCodeAt(k++),d=a.charCodeAt(k++),i=b<<16|c<<8|d,e=i>>18&63,f=i>>12&63,g=i>>6&63,h=63&i,n[l++]=j.charAt(e)+j.charAt(f)+j.charAt(g)+j.charAt(h);while(k=f&&b.chunk_size&&b.runtimes.indexOf("flash")>=0?b.chunk_size=0:(c=20,d=4<d&&(b.chunk_size=d))};g();var h=function(){if(b.uptoken)a.token=b.uptoken;else{var c=a.createAjax();c.open("GET",a.uptoken_url,!0),c.setRequestHeader("If-Modified-Since","0"),c.onreadystatechange=function(){if(4===c.readyState&&200===c.status){var b=a.parseJSON(c.responseText);a.token=b.uptoken}},c.send()}},i=function(c,d,e){var f="",g=!1;if(!b.save_key)if(g=c.getOption&&c.getOption("unique_names"),g=g||c.settings&&c.settings.unique_names){var h=a.getFileExtension(d.name);f=h?d.id+"."+h:d.id}else f="function"==typeof e?e(c,d):d.name;return f};plupload.extend(c,b,{url:"http://up.qiniu.com",multipart_params:{token:""}});var j=new plupload.Uploader(c);return j.bind("Init",function(){h()}),j.init(),j.bind("FilesAdded",function(a,b){var c=a.getOption&&a.getOption("auto_start");c=c||a.settings&&a.settings.auto_start,c&&$.each(b,function(){a.start()}),a.refresh()}),j.bind("BeforeUpload",function(c,d){f="";var e=function(c,d,e){var f;f=b.save_key?{token:a.token}:{key:i(c,d,e),token:a.token};var g=b.x_vars;if(void 0!==g&&"object"==typeof g)for(var h in g)g.hasOwnProperty(h)&&("function"==typeof g[h]?f["x:"+h]=g[h](c,d):"object"!=typeof g[h]&&(f["x:"+h]=g[h]));c.setOption({url:"http://up.qiniu.com/",multipart:!0,chunk_size:void 0,multipart_params:f})},g=c.getOption&&c.getOption("chunk_size");if(g=g||c.settings&&c.settings.chunk_size,"html5"===j.runtime&&g)if(d.sizeg&&b.setOption({url:"http://up.qiniu.com/mkblk/"+g})}),j.bind("Error",function(b){return function(c,d){var e="",f=d.file;if(f){switch(d.code){case plupload.FAILED:e="上传失败。请稍后再试。";break;case plupload.FILE_SIZE_ERROR:var g=c.getOption&&c.getOption("max_file_size");g=g||c.settings&&c.settings.max_file_size,e="浏览器最大可上传"+g+"。更大文件请使用命令行工具。";break;case plupload.FILE_EXTENSION_ERROR:e="文件验证失败。请稍后重试。";break;case plupload.HTTP_ERROR:var h=a.parseJSON(d.response),i=h.error;switch(d.status){case 400:e="请求报文格式错误。";break;case 401:e="客户端认证授权失败。请重试或提交反馈。";break;case 405:e="客户端请求错误。请重试或提交反馈。";break;case 579:e="资源上传成功,但回调失败。";break;case 599:e="网络连接异常。请重试或提交反馈。";break;case 614:e="文件已存在。";try{h=a.parseJSON(h.error),i=h.error||"file exists"}catch(k){throw"invalid json format"}break;case 631:e="指定空间不存在。";break;case 701:e="上传数据块校验出错。请重试或提交反馈。";break;default:e="未知错误。"}e=e+"("+d.status+":"+i+")";break;case plupload.SECURITY_ERROR:e="安全配置错误。请联系网站管理员。";break;case plupload.GENERIC_ERROR:e="上传失败。请稍后再试。";break;case plupload.IO_ERROR:e="上传失败。请稍后再试。";break;case plupload.INIT_ERROR:e="网站配置错误。请联系网站管理员。",j.destroy();break;default:e=d.message+d.details}b&&b(c,d,e)}c.refresh()}}(d)),j.bind("FileUploaded",function(c){return function(d,e,g){var h=function(d,e,f){if(b.downtoken_url){var g=a.createAjax();g.open("POST",b.downtoken_url,!0),g.setRequestHeader("Content-type","application/x-www-form-urlencoded"),g.onreadystatechange=function(){if(4===g.readyState)if(200===g.status){var b;try{b=a.parseJSON(g.responseText)}catch(h){throw"invalid json format"}var i={};plupload.extend(i,a.parseJSON(f),b),c&&c(d,e,JSON.stringify(i))}else j.trigger("Error",{status:g.status,response:g.responseText,file:e,code:plupload.HTTP_ERROR})},g.send("key="+a.parseJSON(f).key+"&domain="+b.domain)}else c&&c(d,e,f)},k=a.parseJSON(g.response);if(f=f?f:k.ctx){var l="";b.save_key||(l=i(d,e,a.key_handler),l=l?"/key/"+a.URLSafeBase64Encode(l):"");var m=b.x_vars,n="",o="";if(void 0!==m&&"object"==typeof m)for(var p in m)m.hasOwnProperty(p)&&("function"==typeof m[p]?n=a.URLSafeBase64Encode(m[p](d,e)):"object"!=typeof m[p]&&(n=a.URLSafeBase64Encode(m[p])),o+="/x:"+p+"/"+n);var q="http://up.qiniu.com/mkfile/"+e.size+l+o,r=a.createAjax();r.open("POST",q,!0),r.setRequestHeader("Content-Type","text/plain;charset=UTF-8"),r.setRequestHeader("Authorization","UpToken "+a.token),r.onreadystatechange=function(){if(4===r.readyState)if(200===r.status){var a=r.responseText;h(d,e,a)}else j.trigger("Error",{status:r.status,response:r.responseText,file:e,code:-200})},r.send(f)}else h(d,e,g.response)}}(e)),j},this.getUrl=function(a){if(!a)return!1;a=encodeURI(a);var b=this.domain;return"/"!==b.slice(b.length-1)&&(b+="/"),b+a},this.imageView2=function(a,b){var c=a.mode||"",d=a.w||"",e=a.h||"",f=a.quality||"",g=a.format||"";if(!c)return!1;if(!d&&!e)return!1;var h="imageView2/"+c;return h+=d?"/w/"+d:"",h+=e?"/h/"+e:"",h+=f?"/q/"+f:"",h+=g?"/format/"+g:"",b&&(h=this.getUrl(b)+"?"+h),h},this.imageMogr2=function(a,b){var c=a["auto-orient"]||"",d=a.thumbnail||"",e=a.strip||"",f=a.gravity||"",g=a.crop||"",h=a.quality||"",i=a.rotate||"",j=a.format||"",k=a.blur||"",l="imageMogr2";return l+=c?"/auto-orient":"",l+=d?"/thumbnail/"+d:"",l+=e?"/strip":"",l+=f?"/gravity/"+f:"",l+=h?"/quality/"+h:"",l+=g?"/crop/"+g:"",l+=i?"/rotate/"+i:"",l+=j?"/format/"+j:"",l+=k?"/blur/"+k:"",b&&(l=this.getUrl(b)+"?"+l),l},this.watermark=function(a,b){var c=a.mode;if(!c)return!1;var d="watermark/"+c;if(1===c){var e=a.image||"";if(!e)return!1;d+=e?"/image/"+this.URLSafeBase64Encode(e):""}else{if(2!==c)return!1;var f=a.text?a.text:"",g=a.font?a.font:"",h=a.fontsize?a.fontsize:"",i=a.fill?a.fill:"";if(!f)return!1;d+=f?"/text/"+this.URLSafeBase64Encode(f):"",d+=g?"/font/"+this.URLSafeBase64Encode(g):"",d+=h?"/fontsize/"+h:"",d+=i?"/fill/"+this.URLSafeBase64Encode(i):""}var j=a.dissolve||"",k=a.gravity||"",l=a.dx||"",m=a.dy||"";return d+=j?"/dissolve/"+j:"",d+=k?"/gravity/"+k:"",d+=l?"/dx/"+l:"",d+=m?"/dy/"+m:"",b&&(d=this.getUrl(b)+"?"+d),d},this.imageInfo=function(a){if(!a)return!1;var b,c=this.getUrl(a)+"?imageInfo",d=this.createAjax(),e=this;return d.open("GET",c,!1),d.onreadystatechange=function(){4===d.readyState&&200===d.status&&(b=e.parseJSON(d.responseText))},d.send(),b},this.exif=function(a){if(!a)return!1;var b,c=this.getUrl(a)+"?exif",d=this.createAjax(),e=this;return d.open("GET",c,!1),d.onreadystatechange=function(){4===d.readyState&&200===d.status&&(b=e.parseJSON(d.responseText))},d.send(),b},this.get=function(a,b){return b&&a?"exif"===a?this.exif(b):"imageInfo"===a?this.imageInfo(b):!1:!1},this.pipeline=function(a,b){var c,d,e="[object Array]"===Object.prototype.toString.call(a),f="";if(e){for(var g=0,h=a.length;h>g;g++){if(c=a[g],!c.fop)return!1;switch(c.fop){case"watermark":f+=this.watermark(c)+"|";break;case"imageView2":f+=this.imageView2(c)+"|";break;case"imageMogr2":f+=this.imageMogr2(c)+"|";break;default:d=!0}if(d)return!1}if(b){f=this.getUrl(b)+"?"+f;var i=f.length;"|"===f.slice(i-1)&&(f=f.slice(0,i-1))}return f}return!1}}var Qiniu=new QiniuJsSDK; \ No newline at end of file