├── .gitignore ├── LICENSE ├── README.md ├── bower.json ├── cors.png ├── demo ├── bootstrap.min.css ├── crypto.js ├── docs.min.css ├── index.html └── jquery-3.2.1.min.js ├── dist └── cos-js-sdk-v4.js ├── gulpfile.js ├── package.json └── src ├── jquery.ajax.js ├── jssha.js └── qcloud_sdk.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | package-lock.json 3 | node_modules -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 腾讯云 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cos-js-sdk-v4 2 | 3 | ## 已弃用 - 请升级到 cos-js-sdk-v5 4 | SDK 依赖的 JSON API 已弃用,请直接使用基于 XML API 的 [cos-js-sdk-v5](https://github.com/tencentyun/cos-js-sdk-v5)。 5 | 6 | 腾讯云 COS JS SDK([JSON API](https://cloud.tencent.com/document/product/436/6052)) 7 | 8 | [releases](https://github.com/tencentyun/cos-js-sdk-v4/releases) 9 | 10 | [详细文档](https://cloud.tencent.com/document/product/436/8095) 11 | 12 | ## 前期准备 13 | 14 | 1. 使用SDK需要浏览器支持HTML 5
15 | 2. 请您到https://console.cloud.tencent.com/cos 获取您的项目ID(appid),bucket,secret_id和secret_key。 16 | 3. 请您到https://console.cloud.tencent.com/cos 针对您要操作的bucket进行跨域(CORS)设置,可以按照如下范例,修改来源 Origin: 17 | 18 | ![./cors.png](./cors.png) 19 | 20 | 21 | ## 配置 22 | 23 | ### Step1. 下载源码 24 | 从github下载源码,将SDK中dist目录下的cos-js-sdk-v4.js包含到您的项目中。 25 | 26 | ### Step.2 加载文件 27 | 在您的页面里引入cos-js-sdk-v4.js
28 | 29 | <script type="text/javascript" src="cos-js-sdk-v4.js"></script>
30 | 31 | ## 使用 32 | 33 | ### cos-js-sdk之v4与v3相比的一些改动 34 | 35 | 1. v3没有地域信息,v4初始化的逻辑,必须指定地域信息,华南地区填gz 华东填sh 华北填tj 36 | 2. v3的auth.php耦合度太高,sha1值使用了flash计算,v4把鉴权的逻辑分离,可以自己实现getAppSign和getAppSignOnce, v4提供了完整的,浏览器端实现签名的示例,注意传给 SDK 的签名要做一次 url 编码 37 | 3. v3分了普通上传和分片上传接口,v4上传直接调用一个接口即可,大文件会自动调用分片逻辑(当然也可以手动调用分片上传) 38 | 4. v4新增了进度回调onprogress 39 | 5. v4进行了模块化封装,可以自行用gulp构建 40 | 6. 如何确定自己应该是用v4的sdk还是v3的? 登陆https://console.cloud.tencent.com/cos 如果左上角提示是云对象存储v4则说明要用v4的sdk否则就是v3的 41 | 42 | ### 可以通过 npm 引入打包依赖 43 | 44 | ``` 45 | npm i cos-js-sdk-v4 --save-dev 46 | ``` 47 | 48 | ### 所有的示例代码实现可以参考sample/index.html 49 | 50 | ### 初始化 51 | 52 | ```js 53 | //初始化逻辑 54 | //特别注意: JS-SDK使用之前请先到 console.cloud.tencent.com/cos 对相应的Bucket进行跨域设置 55 | var cos = new CosCloud({ 56 | appid: appid,// APPID 必填参数 57 | bucket: bucket,//bucketName 必填参数 58 | region: 'sh',//地域信息 必填参数 华南地区填gz 华东填sh 华北填tj 59 | getAppSign: function (callback) {//获取签名 必填参数 60 | 61 | //下面简单讲一下获取签名的几种办法 62 | 63 | //1.搭建一个鉴权服务器,自己构造请求参数获取签名,推荐实际线上业务使用,优点是安全性好,不会暴露自己的私钥 64 | //拿到签名之后记得调用callback 65 | /** 66 | $.ajax('SIGN_URL').done(function (data) { 67 | var sig = data.sign; 68 | callback(sig); 69 | }); 70 | **/ 71 | 72 | //2.直接在浏览器前端计算签名,需要获取自己的accessKey和secretKey, 一般在调试阶段使用 73 | //拿到签名之后记得调用callback 74 | //var res = getAuth(); //这个函数自己根据签名算法实现 75 | //callback(res); 76 | 77 | 78 | //3.直接复用别人算好的签名字符串, 一般在调试阶段使用 79 | //拿到签名之后记得调用callback 80 | //callback('YOUR_SIGN_STR') 81 | // 82 | 83 | }, 84 | getAppSignOnce: function (callback) {//单次签名,必填参数,参考上面的注释即可 85 | //填上获取单次签名的逻辑 86 | // callback('YOUR_SIGN_STR') 87 | } 88 | }); 89 | ``` 90 | 91 | ### 上传程序示例 92 | 93 | ```js 94 | 95 | var myFolder = '/111/';//需要操作的目录 96 | var successCallBack = function (result) { 97 | $("#result").val(JSON.stringify(result)); 98 | }; 99 | 100 | var errorCallBack = function (result) { 101 | result = result || {}; 102 | $("#result").val(result.responseText || 'error'); 103 | }; 104 | 105 | var progressCallBack = function(curr){ 106 | $("#result").val('uploading... curr progress is '+curr); 107 | }; 108 | 109 | $('#js-file').off('change').on('change', function (e) { 110 | var file = e.target.files[0]; 111 | cos.uploadFile(successCallBack, errorCallBack, progressCallBack, bucket, myFolder+file.name, file, 0); 112 | return false; 113 | }); 114 | 115 | ``` 116 | 117 | ### 分片上传大文件程序示例 118 | 119 | ```js 120 | 121 | var myFolder = '/111/';//需要操作的目录 122 | var successCallBack = function (result) { 123 | $("#result").val(JSON.stringify(result)); 124 | }; 125 | 126 | var errorCallBack = function (result) { 127 | result = result || {}; 128 | $("#result").val(result.responseText || 'error'); 129 | }; 130 | 131 | var progressCallBack = function(curr){ 132 | //注意一下这里的进度,这里返回的是总的进度,而不是单个ajax的进度 133 | //例如文件是100M,ajax每次分片上传1M的数据,目前传了500K,则进度应该是 134 | // 500K/100M == 0.05 135 | $("#result").val('uploading... curr progress is '+curr); 136 | }; 137 | 138 | $('#js-file').off('change').on('change', function (e) { 139 | var file = e.target.files[0]; 140 | //分片上传也直接调用uploadFile方法,内部会判断是否需要分片 141 | cos.uploadFile(successCallBack, errorCallBack, progressCallBack, bucket, myFolder+file.name, file, 0); 142 | return false; 143 | }); 144 | 145 | ``` 146 | 147 | ### 创建文件夹示例 148 | 149 | ```js 150 | 151 | $('#createFolder').on('click', function () { 152 | var newFolder = '/333/';//填你需要创建的文件夹,记得用斜杠包一下 153 | cos.createFolder(successCallBack, errorCallBack, bucket, newFolder); 154 | }); 155 | 156 | ``` 157 | 158 | 159 | ### 删除文件夹示例 160 | 161 | ```js 162 | 163 | //删除文件夹 164 | $('#deleteFolder').on('click', function () { 165 | var newFolder = '/333/';//填你需要删除的文件夹,记得用斜杠包一下 166 | cos.deleteFolder(successCallBack, errorCallBack, bucket, newFolder); 167 | }); 168 | 169 | ``` 170 | 171 | 172 | ### 获取文件夹内列表示例 173 | 174 | ```js 175 | 176 | //获取指定文件夹内的列表,默认每次返回20条 177 | $('#getFolderList').on('click', function () { 178 | cos.getFolderList(successCallBack, errorCallBack, bucket, myFolder); 179 | }); 180 | 181 | ``` 182 | 183 | 184 | ### 获取文件夹属性示例 185 | 186 | ```js 187 | 188 | //获取文件夹属性 189 | $('#getFolderStat').on('click', function () { 190 | cos.getFolderStat(successCallBack, errorCallBack, bucket, '/333/'); 191 | }); 192 | 193 | ``` 194 | 195 | 196 | ### 更新文件夹属性示例 197 | 198 | ```js 199 | 200 | //更新文件夹属性 201 | $('#updateFolder').on('click', function () { 202 | cos.updateFolder(successCallBack, errorCallBack, bucket, '/333/', 'new attr'); 203 | }); 204 | 205 | ``` 206 | 207 | ### 删除文件示例 208 | 209 | ```js 210 | 211 | //删除文件 212 | $('#deleteFile').on('click', function () { 213 | var myFile = myFolder+'2.txt';//填你自己实际存在的文件 214 | cos.deleteFile(successCallBack, errorCallBack, bucket, myFile); 215 | }); 216 | 217 | ``` 218 | 219 | ### 获取文件属性示例 220 | 221 | ```js 222 | 223 | //获取文件属性 224 | $('#getFileStat').on('click', function () { 225 | var myFile = myFolder+'2.txt';//填你自己实际存在的文件 226 | cos.getFileStat(successCallBack, errorCallBack, bucket, myFile); 227 | }); 228 | 229 | ``` 230 | 231 | ### 更新文件属性示例 232 | 233 | ```js 234 | 235 | //更新文件属性 236 | $('#updateFile').on('click', function () { 237 | var myFile = myFolder+'2.txt';//填你自己实际存在的文件 238 | cos.updateFile(successCallBack, errorCallBack, bucket, myFile, 'my new file attr'); 239 | }); 240 | 241 | ``` 242 | 243 | ### 拷贝文件示例 244 | 245 | ```js 246 | 247 | //拷贝文件,从源文件地址复制一份到新地址 248 | $('#copyFile').on('click', function () { 249 | 250 | var myFile = '111/2.txt';//填你自己实际存在的文件 251 | 252 | //注意一下目标的路径,这里如果填333/2.txt 则表示文件复制到111/333/2.txt 253 | //如果填/333/2.txt 则表示文件复制到bucket根目录下的333/2.txt 254 | var newFile = '/333/2.txt'; 255 | var overWrite = 1;//0 表示不覆盖 1表示覆盖 256 | cos.copyFile(successCallBack, errorCallBack, bucket, myFile, newFile, overWrite); 257 | }); 258 | 259 | ``` 260 | 261 | ### 移动文件示例 262 | 263 | ```js 264 | 265 | //移动文件,把源文件移动到新地址,如果是同一个目录移动且文件名不同的话,相当于改了一个文件名 266 | //如果是移动到新目录,相当于剪切当前的文件,粘贴到了新目录 267 | $('#moveFile').on('click', function () { 268 | 269 | var myFile = '/111/2.txt';//填你自己实际存在的文件 270 | 271 | //注意一下目标的路径,这里如果填333/2.txt 则表示文件移动到111/333/2.txt 272 | //如果填/333/2.txt 则表示文件移动到bucket根目录下的333/2.txt 273 | //如果填/111/3.txt 则相当于把2.txt改名成3.txt 274 | var newFile = '/333/2.txt'; 275 | var overWrite = 1;//0 表示不覆盖 1表示覆盖 276 | cos.moveFile(successCallBack, errorCallBack, bucket, myFile, newFile, overWrite); 277 | }); 278 | 279 | ``` 280 | 281 | ## 反馈 282 | 283 | 欢迎提issue 284 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cos-js-sdk-v4", 3 | "description": "js-sdk-v4 for 腾讯云对象存储服务", 4 | "main": "dist/cos-js-sdk-v4.js", 5 | "authors": [ 6 | "carsonxu <459452372@qq.com>" 7 | ], 8 | "license": "ISC", 9 | "keywords": [ 10 | "qcloud", 11 | "qcloud-sdk", 12 | "cos", 13 | "cos-sdk" 14 | ], 15 | "homepage": "https://github.com/tencentyun/cos-js-sdk-v4", 16 | "ignore": [ 17 | "**/.*", 18 | "node_modules", 19 | "bower_components", 20 | "test", 21 | "tests" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /cors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tencentyun/cos-js-sdk-v4/a8bb67f62ac68c62f7201ae51940228553489abf/cors.png -------------------------------------------------------------------------------- /demo/crypto.js: -------------------------------------------------------------------------------- 1 | /* 2 | CryptoJS v3.1.2 3 | code.google.com/p/crypto-js 4 | (c) 2009-2013 by Jeff Mott. All rights reserved. 5 | code.google.com/p/crypto-js/wiki/License 6 | */ 7 | var CryptoJS=CryptoJS||function(g,l){var e={},d=e.lib={},m=function(){},k=d.Base={extend:function(a){m.prototype=this;var c=new m;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}}, 8 | p=d.WordArray=k.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||n).stringify(this)},concat:function(a){var c=this.words,q=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var b=0;b>>2]|=(q[b>>>2]>>>24-8*(b%4)&255)<<24-8*((f+b)%4);else if(65535>>2]=q[b>>>2];else c.push.apply(c,q);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<< 9 | 32-8*(c%4);a.length=g.ceil(c/4)},clone:function(){var a=k.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b>>2]>>>24-8*(f%4)&255;b.push((d>>>4).toString(16));b.push((d&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f>>3]|=parseInt(a.substr(f, 10 | 2),16)<<24-4*(f%8);return new p.init(b,c/2)}},j=b.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f>>2]>>>24-8*(f%4)&255));return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new p.init(b,c)}},h=b.Utf8={stringify:function(a){try{return decodeURIComponent(escape(j.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return j.parse(unescape(encodeURIComponent(a)))}}, 11 | r=d.BufferedBlockAlgorithm=k.extend({reset:function(){this._data=new p.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=h.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,b=c.words,f=c.sigBytes,d=this.blockSize,e=f/(4*d),e=a?g.ceil(e):g.max((e|0)-this._minBufferSize,0);a=e*d;f=g.min(4*a,f);if(a){for(var k=0;ka;a++){if(16>a)m[a]=d[e+a]|0;else{var c=m[a-3]^m[a-8]^m[a-14]^m[a-16];m[a]=c<<1|c>>>31}c=(n<<5|n>>>27)+l+m[a];c=20>a?c+((j&h|~j&g)+1518500249):40>a?c+((j^h^g)+1859775393):60>a?c+((j&h|j&g|h&g)-1894007588):c+((j^h^ 15 | g)-899497514);l=g;g=h;h=j<<30|j>>>2;j=n;n=c}b[0]=b[0]+n|0;b[1]=b[1]+j|0;b[2]=b[2]+h|0;b[3]=b[3]+g|0;b[4]=b[4]+l|0},_doFinalize:function(){var d=this._data,e=d.words,b=8*this._nDataBytes,g=8*d.sigBytes;e[g>>>5]|=128<<24-g%32;e[(g+64>>>9<<4)+14]=Math.floor(b/4294967296);e[(g+64>>>9<<4)+15]=b;d.sigBytes=4*e.length;this._process();return this._hash},clone:function(){var e=d.clone.call(this);e._hash=this._hash.clone();return e}});g.SHA1=d._createHelper(l);g.HmacSHA1=d._createHmacHelper(l)})(); 16 | (function(){var g=CryptoJS,l=g.enc.Utf8;g.algo.HMAC=g.lib.Base.extend({init:function(e,d){e=this._hasher=new e.init;"string"==typeof d&&(d=l.parse(d));var g=e.blockSize,k=4*g;d.sigBytes>k&&(d=e.finalize(d));d.clamp();for(var p=this._oKey=d.clone(),b=this._iKey=d.clone(),n=p.words,j=b.words,h=0;h>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 58 | var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; 59 | var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; 60 | 61 | var triplet = (byte1 << 16) | (byte2 << 8) | byte3; 62 | 63 | for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { 64 | base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); 65 | } 66 | } 67 | 68 | // Add padding 69 | var paddingChar = map.charAt(64); 70 | if (paddingChar) { 71 | while (base64Chars.length % 4) { 72 | base64Chars.push(paddingChar); 73 | } 74 | } 75 | 76 | return base64Chars.join(''); 77 | }, 78 | 79 | /** 80 | * Converts a Base64 string to a word array. 81 | * 82 | * @param {string} base64Str The Base64 string. 83 | * 84 | * @return {WordArray} The word array. 85 | * 86 | * @static 87 | * 88 | * @example 89 | * 90 | * var wordArray = CryptoJS.enc.Base64.parse(base64String); 91 | */ 92 | parse: function (base64Str) { 93 | // Shortcuts 94 | var base64StrLength = base64Str.length; 95 | var map = this._map; 96 | 97 | // Ignore padding 98 | var paddingChar = map.charAt(64); 99 | if (paddingChar) { 100 | var paddingIndex = base64Str.indexOf(paddingChar); 101 | if (paddingIndex != -1) { 102 | base64StrLength = paddingIndex; 103 | } 104 | } 105 | 106 | // Convert 107 | var words = []; 108 | var nBytes = 0; 109 | for (var i = 0; i < base64StrLength; i++) { 110 | if (i % 4) { 111 | var bits1 = map.indexOf(base64Str.charAt(i - 1)) << ((i % 4) * 2); 112 | var bits2 = map.indexOf(base64Str.charAt(i)) >>> (6 - (i % 4) * 2); 113 | words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); 114 | nBytes++; 115 | } 116 | } 117 | 118 | return WordArray.create(words, nBytes); 119 | }, 120 | 121 | _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' 122 | }; 123 | }()); 124 | 125 | if(typeof module === 'object'){ 126 | module.exports = CryptoJS; 127 | }else{ 128 | window.CryptoJS = CryptoJS; 129 | } 130 | 131 | -------------------------------------------------------------------------------- /demo/docs.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * IE10 viewport hack for Surface/desktop Windows 8 bug 3 | * Copyright 2014-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */@-ms-viewport{width:device-width}@-o-viewport{width:device-width}@viewport{width:device-width}.hll{background-color:#ffc}.c{color:#999}.err{color:#A00;background-color:#FAA}.k{color:#069}.o{color:#555}.cm{color:#999}.cp{color:#099}.c1{color:#999}.cs{color:#999}.gd{background-color:#FCC;border:1px solid #C00}.ge{font-style:italic}.gr{color:red}.gh{color:#030}.gi{background-color:#CFC;border:1px solid #0C0}.go{color:#AAA}.gp{color:#009}.gu{color:#030}.gt{color:#9C6}.kc{color:#069}.kd{color:#069}.kn{color:#069}.kp{color:#069}.kr{color:#069}.kt{color:#078}.m{color:#F60}.s{color:#d44950}.na{color:#4f9fcf}.nb{color:#366}.nc{color:#0A8}.no{color:#360}.nd{color:#99F}.ni{color:#999}.ne{color:#C00}.nf{color:#C0F}.nl{color:#99F}.nn{color:#0CF}.nt{color:#2f6f9f}.nv{color:#033}.ow{color:#000}.w{color:#bbb}.mf{color:#F60}.mh{color:#F60}.mi{color:#F60}.mo{color:#F60}.sb{color:#C30}.sc{color:#C30}.sd{color:#C30;font-style:italic}.s2{color:#C30}.se{color:#C30}.sh{color:#C30}.si{color:#A00}.sx{color:#C30}.sr{color:#3AA}.s1{color:#C30}.ss{color:#FC3}.bp{color:#366}.vc{color:#033}.vg{color:#033}.vi{color:#033}.il{color:#F60}.css .nt+.nt,.css .o,.css .o+.nt{color:#999}/*! 6 | * Bootstrap Docs (http://getbootstrap.com) 7 | * Copyright 2011-2016 Twitter, Inc. 8 | * Licensed under the Creative Commons Attribution 3.0 Unported License. For 9 | * details, see https://creativecommons.org/licenses/by/3.0/. 10 | */body{position:relative}.table code{font-size:13px;font-weight:400}h2 code,h3 code,h4 code{background-color:inherit}.btn-outline{color:#563d7c;background-color:transparent;border-color:#563d7c}.btn-outline:active,.btn-outline:focus,.btn-outline:hover{color:#fff;background-color:#563d7c;border-color:#563d7c}.btn-outline-inverse{color:#fff;background-color:transparent;border-color:#cdbfe3}.btn-outline-inverse:active,.btn-outline-inverse:focus,.btn-outline-inverse:hover{color:#563d7c;text-shadow:none;background-color:#fff;border-color:#fff}.bs-docs-booticon{display:block;font-weight:500;color:#fff;text-align:center;cursor:default;background-color:#563d7c;border-radius:15%}.bs-docs-booticon-sm{width:30px;height:30px;font-size:20px;line-height:28px}.bs-docs-booticon-lg{width:144px;height:144px;font-size:108px;line-height:140px}.bs-docs-booticon-inverse{color:#563d7c;background-color:#fff}.bs-docs-booticon-outline{background-color:transparent;border:1px solid #cdbfe3}#skippy{display:block;padding:1em;color:#fff;background-color:#6f5499;outline:0}#skippy .skiplink-text{padding:.5em;outline:1px dotted}#content:focus{outline:0}.bs-docs-nav{margin-bottom:0;background-color:#fff;border-bottom:0}.bs-home-nav .bs-nav-b{display:none}.bs-docs-nav .navbar-brand,.bs-docs-nav .navbar-nav>li>a{font-weight:500;color:#563d7c}.bs-docs-nav .navbar-nav>.active>a,.bs-docs-nav .navbar-nav>.active>a:hover,.bs-docs-nav .navbar-nav>li>a:hover{color:#463265;background-color:#f9f9f9}.bs-docs-nav .navbar-toggle .icon-bar{background-color:#563d7c}.bs-docs-nav .navbar-header .navbar-toggle{border-color:#fff}.bs-docs-nav .navbar-header .navbar-toggle:focus,.bs-docs-nav .navbar-header .navbar-toggle:hover{background-color:#f9f9f9;border-color:#f9f9f9}.bs-docs-footer{padding-top:50px;padding-bottom:50px;margin-top:100px;color:#99979c;text-align:center;background-color:#2a2730}.bs-docs-footer a{color:#fff}.bs-docs-footer-links{padding-left:0;margin-bottom:20px}.bs-docs-footer-links li{display:inline-block}.bs-docs-footer-links li+li{margin-left:15px}@media (min-width:768px){.bs-docs-footer{text-align:left}.bs-docs-footer p{margin-bottom:0}}.bs-docs-header,.bs-docs-masthead{position:relative;padding:30px 0;color:#cdbfe3;text-align:center;text-shadow:0 1px 0 rgba(0,0,0,.1);background-color:#6f5499;background-image:-webkit-gradient(linear,left top,left bottom,from(#563d7c),to(#6f5499));background-image:-webkit-linear-gradient(top,#563d7c 0,#6f5499 100%);background-image:-o-linear-gradient(top,#563d7c 0,#6f5499 100%);background-image:linear-gradient(to bottom,#563d7c 0,#6f5499 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#563d7c', endColorstr='#6F5499', GradientType=0);background-repeat:repeat-x}.bs-docs-masthead .bs-docs-booticon{margin:0 auto 30px}.bs-docs-masthead h1{font-weight:300;line-height:1;color:#fff}.bs-docs-masthead .lead{margin:0 auto 30px;font-size:20px;color:#fff}.bs-docs-masthead .version{margin-top:-15px;margin-bottom:30px;color:#9783b9}.bs-docs-masthead .btn{width:100%;padding:15px 30px;font-size:20px}@media (min-width:480px){.bs-docs-masthead .btn{width:auto}}@media (min-width:768px){.bs-docs-masthead{padding:80px 0}.bs-docs-masthead h1{font-size:60px}.bs-docs-masthead .lead{font-size:24px}}@media (min-width:992px){.bs-docs-masthead .lead{width:80%;font-size:30px}}.bs-docs-header{margin-bottom:40px;font-size:20px}.bs-docs-header h1{margin-top:0;color:#fff}.bs-docs-header p{margin-bottom:0;font-weight:300;line-height:1.4}.bs-docs-header .container{position:relative}@media (min-width:768px){.bs-docs-header{padding-top:60px;padding-bottom:60px;font-size:24px;text-align:left}.bs-docs-header h1{font-size:60px;line-height:1}}@media (min-width:992px){.bs-docs-header h1,.bs-docs-header p{margin-right:380px}}.carbonad{width:auto!important;height:auto!important;padding:20px!important;margin:30px -15px -31px!important;overflow:hidden;font-size:13px!important;line-height:16px!important;text-align:left;background:0 0!important;border:solid #866ab3!important;border-width:1px 0!important}.carbonad-img{margin:0!important}.carbonad-tag,.carbonad-text{display:block!important;float:none!important;width:auto!important;height:auto!important;margin-left:145px!important;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif!important}.carbonad-text{padding-top:0!important}.carbonad-tag{color:inherit!important;text-align:left!important}.carbonad-tag a,.carbonad-text a{color:#fff!important}.carbonad #azcarbon>img{display:none}@media (min-width:480px){.carbonad{width:330px!important;margin:20px auto!important;border-width:1px!important;border-radius:4px}.bs-docs-masthead .carbonad{margin:50px auto 0!important}}@media (min-width:768px){.carbonad{margin-right:0!important;margin-left:0!important}}@media (min-width:992px){.carbonad{position:absolute;top:0;right:15px;width:330px!important;padding:15px!important;margin:0!important}.bs-docs-masthead .carbonad{position:static}}.bs-docs-featurette{padding-top:40px;padding-bottom:40px;font-size:16px;line-height:1.5;color:#555;text-align:center;background-color:#fff;border-bottom:1px solid #e5e5e5}.bs-docs-featurette+.bs-docs-footer{margin-top:0;border-top:0}.bs-docs-featurette-title{margin-bottom:5px;font-size:30px;font-weight:400;color:#333}.half-rule{width:100px;margin:40px auto}.bs-docs-featurette h3{margin-bottom:5px;font-weight:400;color:#333}.bs-docs-featurette-img{display:block;margin-bottom:20px;color:#333}.bs-docs-featurette-img:hover{color:#337ab7;text-decoration:none}.bs-docs-featurette-img img{display:block;margin-bottom:15px}@media (min-width:480px){.bs-docs-featurette .img-responsive{margin-top:30px}}@media (min-width:768px){.bs-docs-featurette{padding-top:100px;padding-bottom:100px}.bs-docs-featurette-title{font-size:40px}.bs-docs-featurette .lead{max-width:80%;margin-right:auto;margin-left:auto}.bs-docs-featurette .img-responsive{margin-top:0}}.bs-docs-featured-sites{margin-right:-1px;margin-left:-1px}.bs-docs-featured-sites .col-xs-6{padding:1px}.bs-docs-featured-sites .img-responsive{margin-top:0}@media (min-width:768px){.bs-docs-featured-sites .col-sm-3:first-child img{border-top-left-radius:4px;border-bottom-left-radius:4px}.bs-docs-featured-sites .col-sm-3:last-child img{border-top-right-radius:4px;border-bottom-right-radius:4px}}.bs-examples .thumbnail{margin-bottom:10px}.bs-examples h4{margin-bottom:5px}.bs-examples p{margin-bottom:20px}@media (max-width:480px){.bs-examples{margin-right:-10px;margin-left:-10px}.bs-examples>[class^=col-]{padding-right:10px;padding-left:10px}}.bs-docs-sidebar.affix{position:static}@media (min-width:768px){.bs-docs-sidebar{padding-left:20px}}.bs-docs-sidenav{margin-top:20px;margin-bottom:20px}.bs-docs-sidebar .nav>li>a{display:block;padding:4px 20px;font-size:13px;font-weight:500;color:#767676}.bs-docs-sidebar .nav>li>a:focus,.bs-docs-sidebar .nav>li>a:hover{padding-left:19px;color:#563d7c;text-decoration:none;background-color:transparent;border-left:1px solid #563d7c}.bs-docs-sidebar .nav>.active:focus>a,.bs-docs-sidebar .nav>.active:hover>a,.bs-docs-sidebar .nav>.active>a{padding-left:18px;font-weight:700;color:#563d7c;background-color:transparent;border-left:2px solid #563d7c}.bs-docs-sidebar .nav .nav{display:none;padding-bottom:10px}.bs-docs-sidebar .nav .nav>li>a{padding-top:1px;padding-bottom:1px;padding-left:30px;font-size:12px;font-weight:400}.bs-docs-sidebar .nav .nav>li>a:focus,.bs-docs-sidebar .nav .nav>li>a:hover{padding-left:29px}.bs-docs-sidebar .nav .nav>.active:focus>a,.bs-docs-sidebar .nav .nav>.active:hover>a,.bs-docs-sidebar .nav .nav>.active>a{padding-left:28px;font-weight:500}.back-to-top,.bs-docs-theme-toggle{display:none;padding:4px 10px;margin-top:10px;margin-left:10px;font-size:12px;font-weight:500;color:#999}.back-to-top:hover,.bs-docs-theme-toggle:hover{color:#563d7c;text-decoration:none}.bs-docs-theme-toggle{margin-top:0}@media (min-width:768px){.back-to-top,.bs-docs-theme-toggle{display:block}}@media (min-width:992px){.bs-docs-sidebar .nav>.active>ul{display:block}.bs-docs-sidebar.affix,.bs-docs-sidebar.affix-bottom{width:213px}.bs-docs-sidebar.affix{position:fixed;top:20px}.bs-docs-sidebar.affix-bottom{position:absolute}.bs-docs-sidebar.affix .bs-docs-sidenav,.bs-docs-sidebar.affix-bottom .bs-docs-sidenav{margin-top:0;margin-bottom:0}}@media (min-width:1200px){.bs-docs-sidebar.affix,.bs-docs-sidebar.affix-bottom{width:263px}}.bs-docs-section{margin-bottom:60px}.bs-docs-section:last-child{margin-bottom:0}h1[id]{padding-top:20px;margin-top:0}.bs-callout{padding:20px;margin:20px 0;border:1px solid #eee;border-left-width:5px;border-radius:3px}.bs-callout h4{margin-top:0;margin-bottom:5px}.bs-callout p:last-child{margin-bottom:0}.bs-callout code{border-radius:3px}.bs-callout+.bs-callout{margin-top:-5px}.bs-callout-danger{border-left-color:#ce4844}.bs-callout-danger h4{color:#ce4844}.bs-callout-warning{border-left-color:#aa6708}.bs-callout-warning h4{color:#aa6708}.bs-callout-info{border-left-color:#1b809e}.bs-callout-info h4{color:#1b809e}.color-swatches{margin:0 -5px;overflow:hidden}.color-swatch{float:left;width:60px;height:60px;margin:0 5px;border-radius:3px}@media (min-width:768px){.color-swatch{width:100px;height:100px}}.color-swatches .gray-darker{background-color:#222}.color-swatches .gray-dark{background-color:#333}.color-swatches .gray{background-color:#555}.color-swatches .gray-light{background-color:#999}.color-swatches .gray-lighter{background-color:#eee}.color-swatches .brand-primary{background-color:#337ab7}.color-swatches .brand-success{background-color:#5cb85c}.color-swatches .brand-warning{background-color:#f0ad4e}.color-swatches .brand-danger{background-color:#d9534f}.color-swatches .brand-info{background-color:#5bc0de}.color-swatches .bs-purple{background-color:#563d7c}.color-swatches .bs-purple-light{background-color:#c7bfd3}.color-swatches .bs-purple-lighter{background-color:#e5e1ea}.color-swatches .bs-gray{background-color:#f9f9f9}.bs-team .team-member{line-height:32px;color:#555}.bs-team .team-member:hover{color:#333;text-decoration:none}.bs-team .github-btn{float:right;width:180px;height:20px;margin-top:6px;border:none}.bs-team img{float:left;width:32px;margin-right:10px;border-radius:4px}.bs-docs-browser-bugs td p{margin-bottom:0}.bs-docs-browser-bugs th:first-child{width:18%}.show-grid{margin-bottom:15px}.show-grid [class^=col-]{padding-top:10px;padding-bottom:10px;background-color:#eee;background-color:rgba(86,61,124,.15);border:1px solid #ddd;border:1px solid rgba(86,61,124,.2)}.bs-example{position:relative;padding:45px 15px 15px;margin:0 -15px 15px;border-color:#e5e5e5 #eee #eee;border-style:solid;border-width:1px 0;-webkit-box-shadow:inset 0 3px 6px rgba(0,0,0,.05);box-shadow:inset 0 3px 6px rgba(0,0,0,.05)}.bs-example:after{position:absolute;top:15px;left:15px;font-size:12px;font-weight:700;color:#959595;text-transform:uppercase;letter-spacing:1px;content:"Example"}.bs-example-padded-bottom{padding-bottom:24px}.bs-example+.highlight,.bs-example+.zero-clipboard+.highlight{margin:-15px -15px 15px;border-width:0 0 1px;border-radius:0}@media (min-width:768px){.bs-example{margin-right:0;margin-left:0;background-color:#fff;border-color:#ddd;border-width:1px;border-radius:4px 4px 0 0;-webkit-box-shadow:none;box-shadow:none}.bs-example+.highlight,.bs-example+.zero-clipboard+.highlight{margin-top:-16px;margin-right:0;margin-left:0;border-width:1px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.bs-example-standalone{border-radius:4px}}.bs-example .container{width:auto}.bs-example>.alert:last-child,.bs-example>.form-control:last-child,.bs-example>.jumbotron:last-child,.bs-example>.list-group:last-child,.bs-example>.navbar:last-child,.bs-example>.panel:last-child,.bs-example>.progress:last-child,.bs-example>.table-responsive:last-child>.table,.bs-example>.table:last-child,.bs-example>.well:last-child,.bs-example>blockquote:last-child,.bs-example>ol:last-child,.bs-example>p:last-child,.bs-example>ul:last-child{margin-bottom:0}.bs-example>p>.close{float:none}.bs-example-type .table .type-info{color:#767676;vertical-align:middle}.bs-example-type .table td{padding:15px 0;border-color:#eee}.bs-example-type .table tr:first-child td{border-top:0}.bs-example-type h1,.bs-example-type h2,.bs-example-type h3,.bs-example-type h4,.bs-example-type h5,.bs-example-type h6{margin:0}.bs-example-bg-classes p{padding:15px}.bs-example>.img-circle,.bs-example>.img-rounded,.bs-example>.img-thumbnail{margin:5px}.bs-example>.table-responsive>.table{background-color:#fff}.bs-example>.btn,.bs-example>.btn-group{margin-top:5px;margin-bottom:5px}.bs-example>.btn-toolbar+.btn-toolbar{margin-top:10px}.bs-example-control-sizing input[type=text]+input[type=text],.bs-example-control-sizing select{margin-top:10px}.bs-example-form .input-group{margin-bottom:10px}.bs-example>textarea.form-control{resize:vertical}.bs-example>.list-group{max-width:400px}.bs-example .navbar:last-child{margin-bottom:0}.bs-navbar-bottom-example,.bs-navbar-top-example{z-index:1;padding:0;overflow:hidden}.bs-navbar-bottom-example .navbar-header,.bs-navbar-top-example .navbar-header{margin-left:0}.bs-navbar-bottom-example .navbar-fixed-bottom,.bs-navbar-top-example .navbar-fixed-top{position:relative;margin-right:0;margin-left:0}.bs-navbar-top-example{padding-bottom:45px}.bs-navbar-top-example:after{top:auto;bottom:15px}.bs-navbar-top-example .navbar-fixed-top{top:-1px}.bs-navbar-bottom-example{padding-top:45px}.bs-navbar-bottom-example .navbar-fixed-bottom{bottom:-1px}.bs-navbar-bottom-example .navbar{margin-bottom:0}@media (min-width:768px){.bs-navbar-bottom-example .navbar-fixed-bottom,.bs-navbar-top-example .navbar-fixed-top{position:absolute}}.bs-example .pagination{margin-top:10px;margin-bottom:10px}.bs-example>.pager{margin-top:0}.bs-example-modal{background-color:#f5f5f5}.bs-example-modal .modal{position:relative;top:auto;right:auto;bottom:auto;left:auto;z-index:1;display:block}.bs-example-modal .modal-dialog{left:auto;margin-right:auto;margin-left:auto}.bs-example>.dropdown>.dropdown-toggle{float:left}.bs-example>.dropdown>.dropdown-menu{position:static;display:block;margin-bottom:5px;clear:left}.bs-example-tabs .nav-tabs{margin-bottom:15px}.bs-example-tooltips{text-align:center}.bs-example-tooltips>.btn{margin-top:5px;margin-bottom:5px}.bs-example-tooltip .tooltip{position:relative;display:inline-block;margin:10px 20px;opacity:1}.bs-example-popover{padding-bottom:24px;background-color:#f9f9f9}.bs-example-popover .popover{position:relative;display:block;float:left;width:260px;margin:20px}.scrollspy-example{position:relative;height:200px;margin-top:10px;overflow:auto}.bs-example>.nav-pills-stacked-example{max-width:300px}#collapseExample .well{margin-bottom:0}.bs-events-table>tbody>tr>td:first-child,.bs-events-table>thead>tr>th:first-child{white-space:nowrap}.bs-events-table>thead>tr>th:first-child{width:150px}.js-options-table>thead>tr>th:nth-child(1),.js-options-table>thead>tr>th:nth-child(2){width:100px}.js-options-table>thead>tr>th:nth-child(3){width:50px}.highlight{padding:9px 14px;margin-bottom:14px;background-color:#f7f7f9;border:1px solid #e1e1e8;border-radius:4px}.highlight pre{padding:0;margin-top:0;margin-bottom:0;word-break:normal;white-space:nowrap;background-color:transparent;border:0}.highlight pre code{font-size:inherit;color:#333}.highlight pre code:first-child{display:inline-block;padding-right:45px}.table-responsive .highlight pre{white-space:normal}.bs-table th small,.responsive-utilities th small{display:block;font-weight:400;color:#999}.responsive-utilities tbody th{font-weight:400}.responsive-utilities td{text-align:center}.responsive-utilities td.is-visible{color:#468847;background-color:#dff0d8!important}.responsive-utilities td.is-hidden{color:#ccc;background-color:#f9f9f9!important}.responsive-utilities-test{margin-top:5px}.responsive-utilities-test .col-xs-6{margin-bottom:10px}.responsive-utilities-test span{display:block;padding:15px 10px;font-size:14px;font-weight:700;line-height:1.1;text-align:center;border-radius:4px}.hidden-on .col-xs-6 .hidden-lg,.hidden-on .col-xs-6 .hidden-md,.hidden-on .col-xs-6 .hidden-sm,.hidden-on .col-xs-6 .hidden-xs,.visible-on .col-xs-6 .hidden-lg,.visible-on .col-xs-6 .hidden-md,.visible-on .col-xs-6 .hidden-sm,.visible-on .col-xs-6 .hidden-xs{color:#999;border:1px solid #ddd}.hidden-on .col-xs-6 .visible-lg-block,.hidden-on .col-xs-6 .visible-md-block,.hidden-on .col-xs-6 .visible-sm-block,.hidden-on .col-xs-6 .visible-xs-block,.visible-on .col-xs-6 .visible-lg-block,.visible-on .col-xs-6 .visible-md-block,.visible-on .col-xs-6 .visible-sm-block,.visible-on .col-xs-6 .visible-xs-block{color:#468847;background-color:#dff0d8;border:1px solid #d6e9c6}.bs-glyphicons{margin:0 -10px 20px;overflow:hidden}.bs-glyphicons-list{padding-left:0;list-style:none}.bs-glyphicons li{float:left;width:25%;height:115px;padding:10px;font-size:10px;line-height:1.4;text-align:center;background-color:#f9f9f9;border:1px solid #fff}.bs-glyphicons .glyphicon{margin-top:5px;margin-bottom:10px;font-size:24px}.bs-glyphicons .glyphicon-class{display:block;text-align:center;word-wrap:break-word}.bs-glyphicons li:hover{color:#fff;background-color:#563d7c}@media (min-width:768px){.bs-glyphicons{margin-right:0;margin-left:0}.bs-glyphicons li{width:12.5%;font-size:12px}}.bs-customizer .toggle{float:right;margin-top:25px}.bs-customizer label{margin-top:10px;font-weight:500;color:#555}.bs-customizer h2{padding-top:30px;margin-top:0;margin-bottom:5px}.bs-customizer h3{margin-bottom:0}.bs-customizer h4{margin-top:15px;margin-bottom:0}.bs-customizer .bs-callout h4{margin-top:0;margin-bottom:5px}.bs-customizer input[type=text]{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;background-color:#fafafa}.bs-customizer .help-block{margin-bottom:5px;font-size:12px}#less-section label{font-weight:400}.bs-customize-download .btn-outline{padding:20px}.bs-customizer-alert{position:fixed;top:0;right:0;left:0;z-index:1030;padding:15px 0;color:#fff;background-color:#d9534f;border-bottom:1px solid #b94441;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25);box-shadow:inset 0 1px 0 rgba(255,255,255,.25)}.bs-customizer-alert .close{margin-top:-4px;font-size:24px}.bs-customizer-alert p{margin-bottom:0}.bs-customizer-alert .glyphicon{margin-right:5px}.bs-customizer-alert pre{margin:10px 0 0;color:#fff;background-color:#a83c3a;border-color:#973634;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 2px 4px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}.bs-dropzone{position:relative;padding:20px;margin-bottom:20px;color:#777;text-align:center;border:2px dashed #eee;border-radius:4px}.bs-dropzone .import-header{margin-bottom:5px}.bs-dropzone .glyphicon-download-alt{font-size:40px}.bs-dropzone hr{width:100px}.bs-dropzone .lead{margin-bottom:10px;font-weight:400;color:#333}#import-manual-trigger{cursor:pointer}.bs-dropzone p:last-child{margin-bottom:0}.bs-brand-logos{display:table;width:100%;margin-bottom:15px;overflow:hidden;color:#563d7c;background-color:#f9f9f9;border-radius:4px}.bs-brand-item{padding:60px 0;text-align:center}.bs-brand-item+.bs-brand-item{border-top:1px solid #fff}.bs-brand-logos .inverse{color:#fff;background-color:#563d7c}.bs-brand-item h1,.bs-brand-item h3{margin-top:0;margin-bottom:0}.bs-brand-item .bs-docs-booticon{margin-right:auto;margin-left:auto}.bs-brand-item .glyphicon{width:30px;height:30px;margin:10px auto -10px;line-height:30px;color:#fff;border-radius:50%}.bs-brand-item .glyphicon-ok{background-color:#5cb85c}.bs-brand-item .glyphicon-remove{background-color:#d9534f}@media (min-width:768px){.bs-brand-item{display:table-cell;width:1%}.bs-brand-item+.bs-brand-item{border-top:0;border-left:1px solid #fff}.bs-brand-item h1{font-size:60px}}.zero-clipboard{position:relative;display:none}.btn-clipboard{position:absolute;top:0;right:0;z-index:10;display:block;padding:5px 8px;font-size:12px;color:#767676;cursor:pointer;background-color:#fff;border:1px solid #e1e1e8;border-radius:0 4px 0 4px}.btn-clipboard-hover{color:#fff;background-color:#563d7c;border-color:#563d7c}@media (min-width:768px){.zero-clipboard{display:block}.bs-example+.zero-clipboard .btn-clipboard{top:-16px;border-top-right-radius:0}}.anchorjs-link{color:inherit}@media (max-width:480px){.anchorjs-link{display:none}}:hover>.anchorjs-link{opacity:.75;-webkit-transition:color .16s linear;-o-transition:color .16s linear;transition:color .16s linear}.anchorjs-link:focus,:hover>.anchorjs-link:hover{text-decoration:none;opacity:1}#focusedInput{border-color:#ccc;border-color:rgba(82,168,236,.8);outline:0;outline:thin dotted\9;-webkit-box-shadow:0 0 8px rgba(82,168,236,.6);box-shadow:0 0 8px rgba(82,168,236,.6)}.v4-tease{display:block;padding:15px 20px;font-weight:700;color:#fff;text-align:center;background-color:#0275d8}.v4-tease:hover{color:#fff;text-decoration:none;background-color:#0269c2}@media print{a[href]:after{content:""!important}} 11 | /*# sourceMappingURL=docs.min.css.map */ -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | cos-js-sdk-v4 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 220 | 221 | 222 |
223 |
224 |

腾讯云COS js-sdk-v4

225 |
226 |
227 |
228 |
229 | 230 |
231 | 232 |
233 | 234 | 235 | 236 | 237 |
238 |
239 | 240 | 241 | 242 | 243 |
244 |
245 | 246 | 247 | 248 | 249 | 250 |
251 |
252 | 255 |
256 |
257 | 258 | -------------------------------------------------------------------------------- /dist/cos-js-sdk-v4.js: -------------------------------------------------------------------------------- 1 | /* cos-js-sdk-v4 1.2.1 */ 2 | ;(function(){var $=function(){function e(e){var t=e.length,n=D.type(e);return"function"!==n&&!D.isWindow(e)&&(!(1!==e.nodeType||!t)||("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e))}function t(e){var t=M[e]={};return D.each(e.match(P)||[],function(e,n){t[n]=!0}),t}function n(){q.addEventListener?(q.removeEventListener("DOMContentLoaded",r,!1),window.removeEventListener("load",r,!1)):(q.detachEvent("onreadystatechange",r),window.detachEvent("onload",r))}function r(){(q.addEventListener||"load"===event.type||"complete"===q.readyState)&&(n(),D.ready())}function a(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(B,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:$.test(n)?D.parseJSON(n):n)}catch(a){}D.data(e,t,n)}else n=void 0}return n}function i(e){var t;for(t in e)if(("data"!==t||!D.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function o(e,t,n,r){if(D.acceptData(e)){var a,i,o=D.expando,s=e.nodeType,c=s?D.cache:e,u=s?e[o]:e[o]&&o;if(u&&c[u]&&(r||c[u].data)||void 0!==n||"string"!=typeof t)return u||(u=s?e[o]=g.pop()||D.guid++:o),c[u]||(c[u]=s?{}:{toJSON:D.noop}),"object"!=typeof t&&"function"!=typeof t||(r?c[u]=D.extend(c[u],t):c[u].data=D.extend(c[u].data,t)),i=c[u],r||(i.data||(i.data={}),i=i.data),void 0!==n&&(i[D.camelCase(t)]=n),"string"==typeof t?(a=i[t],null==a&&(a=i[D.camelCase(t)])):a=i,a}}function s(e,t,n){if(D.acceptData(e)){var r,a,o=e.nodeType,s=o?D.cache:e,c=o?e[D.expando]:D.expando;if(s[c]){if(t&&(r=n?s[c]:s[c].data)){D.isArray(t)?t=t.concat(D.map(t,D.camelCase)):t in r?t=[t]:(t=D.camelCase(t),t=t in r?[t]:t.split(" ")),a=t.length;for(;a--;)delete r[t[a]];if(n?!i(r):!D.isEmptyObject(r))return}(n||(delete s[c].data,i(s[c])))&&(o?D.cleanData([e],!0):C.deleteExpando||s!=s.window?delete s[c]:s[c]=null)}}}function c(){return!0}function u(){return!1}function l(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,a=0,i=t.toLowerCase().match(P)||[];if(D.isFunction(n))for(;r=i[a++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function d(e,t,n,r){function a(s){var c;return i[s]=!0,D.each(e[s]||[],function(e,s){var u=s(t,n,r);return"string"!=typeof u||o||i[u]?o?!(c=u):void 0:(t.dataTypes.unshift(u),a(u),!1)}),c}var i={},o=e===ce;return a(t.dataTypes[0])||!i["*"]&&a("*")}function f(e,t){var n,r,a=D.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((a[r]?e:n||(n={}))[r]=t[r]);return n&&D.extend(!0,e,n),e}function p(e,t,n){for(var r,a,i,o,s=e.contents,c=e.dataTypes;"*"===c[0];)c.shift(),void 0===a&&(a=e.mimeType||t.getResponseHeader("Content-Type"));if(a)for(o in s)if(s[o]&&s[o].test(a)){c.unshift(o);break}if(c[0]in n)i=c[0];else{for(o in n){if(!c[0]||e.converters[o+" "+c[0]]){i=o;break}r||(r=o)}i=i||r}if(i)return i!==c[0]&&c.unshift(i),n[i]}function h(e,t,n,r){var a,i,o,s,c,u={},l=e.dataTypes.slice();if(l[1])for(o in e.converters)u[o.toLowerCase()]=e.converters[o];for(i=l.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!c&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),c=i,i=l.shift())if("*"===i)i=c;else if("*"!==c&&c!==i){if(o=u[c+" "+i]||u["* "+i],!o)for(a in u)if(s=a.split(" "),s[1]===i&&(o=u[c+" "+s[0]]||u["* "+s[0]])){o===!0?o=u[a]:u[a]!==!0&&(i=s[0],l.unshift(s[1]));break}if(o!==!0)if(o&&e["throws"])t=o(t);else try{t=o(t)}catch(d){return{state:"parsererror",error:o?d:"No conversion from "+c+" to "+i}}}return{state:"success",data:t}}function v(e,t,n,r){var a;if(D.isArray(t))D.each(t,function(t,a){n||fe.test(e)?r(e,a):v(e+"["+("object"==typeof a?t:"")+"]",a,n,r)});else if(n||"object"!==D.type(t))r(e,t);else for(a in t)v(e+"["+a+"]",t[a],n,r)}function y(){try{return new window.XMLHttpRequest}catch(e){}}function m(){try{return new window.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}var g=[],x=g.slice,b=g.concat,w=g.push,j=g.indexOf,T={},E=T.toString,S=T.hasOwnProperty,C={},k="1.11.1 -css,-css/addGetHookIf,-css/curCSS,-css/defaultDisplay,-css/hiddenVisibleSelectors,-css/support,-css/swap,-css/var/cssExpand,-css/var/isHidden,-css/var/rmargin,-css/var/rnumnonpx,-effects,-effects/Tween,-effects/animatedSelector,-effects/support,-dimensions,-offset,-deprecated,-event-alias,-wrap",D=function(e,t){return new D.fn.init(e,t)},_=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,L=/^-ms-/,A=/-([\da-z])/gi,N=function(e,t){return t.toUpperCase()};D.fn=D.prototype={jquery:k,constructor:D,selector:"",length:0,toArray:function(){return x.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:x.call(this)},pushStack:function(e){var t=D.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return D.each(this,e,t)},map:function(e){return this.pushStack(D.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(x.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==D.type(e)||e.nodeType||D.isWindow(e))return!1;try{if(e.constructor&&!S.call(e,"constructor")&&!S.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(C.ownLast)for(t in e)return S.call(e,t);for(t in e);return void 0===t||S.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?T[E.call(e)]||"object":typeof e},globalEval:function(e){e&&D.trim(e)&&(window.execScript||function(e){window.eval.call(window,e)})(e)},camelCase:function(e){return e.replace(L,"ms-").replace(A,N)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(t,n,r){var a,i=0,o=t.length,s=e(t);if(r){if(s)for(;i)[^>]*|#([\w-]*))$/,F=D.fn.init=function(e,t){var n,r;if(!e)return this;if("string"==typeof e){if(n="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:H.exec(e),!n||!n[1]&&t)return!t||t.jquery?(t||O).find(e):this.constructor(t).find(e);if(n[1]){if(t=t instanceof D?t[0]:t,D.merge(this,D.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:q,!0)),rsingleTag.test(n[1])&&D.isPlainObject(t))for(n in t)D.isFunction(this[n])?this[n](t[n]):this.attr(n,t[n]);return this}if(r=q.getElementById(n[2]),r&&r.parentNode){if(r.id!==n[2])return O.find(e);this.length=1,this[0]=r}return this.context=q,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):D.isFunction(e)?"undefined"!=typeof O.ready?O.ready(e):e(D):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),D.makeArray(e,this))};F.prototype=D.fn,O=D(q);var P=/\S+/g,M={};D.Callbacks=function(e){e="string"==typeof e?M[e]||t(e):D.extend({},e);var n,r,a,i,o,s,c=[],u=!e.once&&[],l=function(t){for(r=e.memory&&t,a=!0,o=s||0,s=0,i=c.length,n=!0;c&&o-1;)c.splice(r,1),n&&(r<=i&&i--,r<=o&&o--)}),this},has:function(e){return e?D.inArray(e,c)>-1:!(!c||!c.length)},empty:function(){return c=[],i=0,this},disable:function(){return c=u=r=void 0,this},disabled:function(){return!c},lock:function(){return u=void 0,r||d.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!c||a&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):l(t)),this},fire:function(){return d.fireWith(this,arguments),this},fired:function(){return!!a}};return d},D.extend({Deferred:function(e){var t=[["resolve","done",D.Callbacks("once memory"),"resolved"],["reject","fail",D.Callbacks("once memory"),"rejected"],["notify","progress",D.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return a.done(arguments).fail(arguments),this},then:function(){var e=arguments;return D.Deferred(function(n){D.each(t,function(t,i){var o=D.isFunction(e[t])&&e[t];a[i[1]](function(){var e=o&&o.apply(this,arguments);e&&D.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[i[0]+"With"](this===r?n.promise():this,o?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?D.extend(e,r):r}},a={};return r.pipe=r.then,D.each(t,function(e,i){var o=i[2],s=i[3];r[i[1]]=o.add,s&&o.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),a[i[0]]=function(){return a[i[0]+"With"](this===a?r:this,arguments),this},a[i[0]+"With"]=o.fireWith}),r.promise(a),e&&e.call(a,a),a},when:function(e){var t,n,r,a=0,i=x.call(arguments),o=i.length,s=1!==o||e&&D.isFunction(e.promise)?o:0,c=1===s?e:D.Deferred(),u=function(e,n,r){return function(a){n[e]=this,r[e]=arguments.length>1?x.call(arguments):a,r===t?c.notifyWith(n,r):--s||c.resolveWith(n,r)}};if(o>1)for(t=new Array(o),n=new Array(o),r=new Array(o);a0||(W.resolveWith(q,[D]),D.fn.triggerHandler&&(D(q).triggerHandler("ready"),D(q).off("ready")))}}}),D.ready.promise=function(e){if(!W)if(W=D.Deferred(),"complete"===q.readyState)setTimeout(D.ready);else if(q.addEventListener)q.addEventListener("DOMContentLoaded",r,!1),window.addEventListener("load",r,!1);else{q.attachEvent("onreadystatechange",r),window.attachEvent("onload",r);var t=!1;try{t=null==window.frameElement&&q.documentElement}catch(a){}t&&t.doScroll&&!function i(){if(!D.isReady){try{t.doScroll("left")}catch(e){return setTimeout(i,50)}n(),D.ready()}}()}return W.promise(e)};var R,X="undefined";for(R in D(C))break;C.ownLast="0"!==R,C.inlineBlockNeedsLayout=!1,D(function(){var e,t,n,r;n=q.getElementsByTagName("body")[0],n&&n.style&&(t=q.createElement("div"),r=q.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),typeof t.style.zoom!==X&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",C.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=q.createElement("div");if(null==C.deleteExpando){C.deleteExpando=!0;try{delete e.test}catch(t){C.deleteExpando=!1}}e=null}(),D.acceptData=function(e){var t=D.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)};var $=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,B=/([A-Z])/g;D.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?D.cache[e[D.expando]]:e[D.expando],!!e&&!i(e)},data:function(e,t,n){return o(e,t,n)},removeData:function(e,t){return s(e,t)},_data:function(e,t,n){return o(e,t,n,!0)},_removeData:function(e,t){return s(e,t,!0)}}),D.fn.extend({data:function(e,t){var n,r,i,o=this[0],s=o&&o.attributes;if(void 0===e){if(this.length&&(i=D.data(o),1===o.nodeType&&!D._data(o,"parsedAttrs"))){for(n=s.length;n--;)s[n]&&(r=s[n].name,0===r.indexOf("data-")&&(r=D.camelCase(r.slice(5)),a(o,r,i[r])));D._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){D.data(this,e)}):arguments.length>1?this.each(function(){D.data(this,e,t)}):o?a(o,e,D.data(o,e)):void 0},removeData:function(e){return this.each(function(){D.removeData(this,e)})}}),D.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=D._data(e,t),n&&(!r||D.isArray(n)?r=D._data(e,t,D.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=D.queue(e,t),r=n.length,a=n.shift(),i=D._queueHooks(e,t),o=function(){D.dequeue(e,t)};"inprogress"===a&&(a=n.shift(),r--),a&&("fx"===t&&n.unshift("inprogress"),delete i.stop,a.call(e,o,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return D._data(e,n)||D._data(e,n,{empty:D.Callbacks("once memory").add(function(){D._removeData(e,t+"queue"),D._removeData(e,n)})})}}),D.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length=0&&(p=f.split("."),f=p.shift(),p.sort()),i=f.indexOf(":")<0&&"on"+f,e=e[D.expando]?e:new D.Event(f,"object"==typeof e&&e),e.isTrigger=r?2:3,e.namespace=p.join("."),e.namespace_re=e.namespace?new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:D.makeArray(t,[e]),c=D.event.special[f]||{},r||!c.trigger||c.trigger.apply(n,t)!==!1)){if(!r&&!c.noBubble&&!D.isWindow(n)){for(s=c.delegateType||f,K.test(s+f)||(o=o.parentNode);o;o=o.parentNode)d.push(o),u=o;u===(n.ownerDocument||q)&&d.push(u.defaultView||u.parentWindow||window)}for(l=0;(o=d[l++])&&!e.isPropagationStopped();)e.type=l>1?s:c.bindType||f,a=(D._data(o,"events")||{})[e.type]&&D._data(o,"handle"),a&&a.apply(o,t),a=i&&o[i],a&&a.apply&&D.acceptData(o)&&(e.result=a.apply(o,t),e.result===!1&&e.preventDefault());if(e.type=f,!r&&!e.isDefaultPrevented()&&(!c._default||c._default.apply(d.pop(),t)===!1)&&D.acceptData(n)&&i&&n[f]&&!D.isWindow(n)){u=n[i],u&&(n[i]=null),D.event.triggered=f;try{n[f]()}catch(h){}D.event.triggered=void 0,u&&(n[i]=u)}return e.result}},dispatch:function(e){e=D.event.fix(e);var t,n,r,a,i,o=[],s=x.call(arguments),c=(D._data(this,"events")||{})[e.type]||[],u=D.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!u.preDispatch||u.preDispatch.call(this,e)!==!1){for(o=D.event.handlers.call(this,e,c),t=0;(a=o[t++])&&!e.isPropagationStopped();)for(e.currentTarget=a.elem,i=0;(r=a.handlers[i++])&&!e.isImmediatePropagationStopped();)e.namespace_re&&!e.namespace_re.test(r.namespace)||(e.handleObj=r,e.data=r.data,n=((D.event.special[r.origType]||{}).handle||r.handler).apply(a.elem,s),void 0!==n&&(e.result=n)===!1&&(e.preventDefault(),e.stopPropagation()));return u.postDispatch&&u.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,a,i,o=[],s=t.delegateCount,c=e.target;if(s&&c.nodeType&&(!e.button||"click"!==e.type))for(;c!=this;c=c.parentNode||this)if(1===c.nodeType&&(c.disabled!==!0||"click"!==e.type)){for(a=[],i=0;i=0:D.find(n,this,null,[c]).length),a[n]&&a.push(r);a.length&&o.push({elem:c,handlers:a})}return s0?4:0,a=e>=200&&e<300||304===e,n&&(b=p(f,E,n)),b=h(f,b,E,a),a?(f.ifModified&&(w=E.getResponseHeader("Last-Modified"),w&&(D.lastModified[i]=w),w=E.getResponseHeader("etag"),w&&(D.etag[i]=w)),204===e||"HEAD"===f.type?T="nocontent":304===e?T="notmodified":(T=b.state,l=b.data,d=b.error,a=!d)):(d=T,!e&&T||(T="error",e<0&&(e=0))),E.status=e,E.statusText=(t||T)+"",a?m.resolveWith(v,[l,T,E]):m.rejectWith(v,[E,T,d]),E.statusCode(x),x=void 0,c&&y.trigger(a?"ajaxSuccess":"ajaxError",[E,f,a?l:d]),g.fireWith(v,[E,T]),c&&(y.trigger("ajaxComplete",[E,f]),--D.active||D.event.trigger("ajaxStop")))}"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,a,i,o,s,c,u,l,f=D.ajaxSetup({},t),v=f.context||f,y=f.context&&(v.nodeType||v.jquery)?D(v):D.event,m=D.Deferred(),g=D.Callbacks("once memory"),x=f.statusCode||{},b={},w={},j=0,T="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(2===j){if(!l)for(l={};t=ne.exec(o);)l[t[1].toLowerCase()]=t[2];t=l[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===j?o:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return j||(e=w[n]=w[n]||e,b[e]=t),this},overrideMimeType:function(e){return j||(f.mimeType=e),this},statusCode:function(e){var t;if(e)if(j<2)for(t in e)x[t]=[x[t],e[t]];else E.always(e[E.status]);return this},abort:function(e){var t=e||T;return u&&u.abort(t),n(0,t),this}};if(m.promise(E).complete=g.add,E.success=E.done,E.error=E.fail,f.url=((e||f.url||Z)+"").replace(ee,"").replace(ie,Q[1]+"//"),f.type=t.method||t.type||f.method||f.type,f.dataTypes=D.trim(f.dataType||"*").toLowerCase().match(P)||[""],null==f.crossDomain&&(r=oe.exec(f.url.toLowerCase()),f.crossDomain=!(!r||r[1]===Q[1]&&r[2]===Q[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(Q[3]||("http:"===Q[1]?"80":"443")))),f.data&&f.processData&&"string"!=typeof f.data&&(f.data=D.param(f.data,f.traditional)),d(se,f,t,E),2===j)return E;c=f.global,c&&0===D.active++&&D.event.trigger("ajaxStart"),f.type=f.type.toUpperCase(),f.hasContent=!ae.test(f.type),i=f.url,f.hasContent||(f.data&&(i=f.url+=(G.test(i)?"&":"?")+f.data,delete f.data),f.cache===!1&&(f.url=te.test(i)?i.replace(te,"$1_="+Y++):i+(G.test(i)?"&":"?")+"_="+Y++)),f.ifModified&&(D.lastModified[i]&&E.setRequestHeader("If-Modified-Since",D.lastModified[i]),D.etag[i]&&E.setRequestHeader("If-None-Match",D.etag[i])),(f.data&&f.hasContent&&f.contentType!==!1||t.contentType)&&E.setRequestHeader("Content-Type",f.contentType),E.setRequestHeader("Accept",f.dataTypes[0]&&f.accepts[f.dataTypes[0]]?f.accepts[f.dataTypes[0]]+("*"!==f.dataTypes[0]?", "+ue+"; q=0.01":""):f.accepts["*"]);for(a in f.headers)E.setRequestHeader(a,f.headers[a]);if(f.beforeSend&&(f.beforeSend.call(v,E,f)===!1||2===j))return E.abort();T="abort";for(a in{success:1,error:1,complete:1})E[a](f[a]);if(u=d(ce,f,t,E)){E.readyState=1,c&&y.trigger("ajaxSend",[E,f]),f.async&&f.timeout>0&&(s=setTimeout(function(){E.abort("timeout")},f.timeout));try{j=1,u.send(b,n)}catch(S){if(!(j<2))throw S;n(-1,S)}}else n(-1,"No Transport");return E},getJSON:function(e,t,n){return D.get(e,t,n,"json")},getScript:function(e,t){return D.get(e,void 0,t,"script")}}),D.each(["get","post"],function(e,t){D[t]=function(e,n,r,a){return D.isFunction(n)&&(a=a||r,r=n,n=void 0),D.ajax({url:e,type:t,dataType:a,data:n,success:r})}}),D.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){D.fn[t]=function(e){return this.on(t,e)}}),D._evalUrl=function(e){return D.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})};var de=/%20/g,fe=/\[\]$/,pe=/\r?\n/g,he=/^(?:submit|button|image|reset|file)$/i,ve=/^(?:input|select|textarea|keygen)/i;D.param=function(e,t){var n,r=[],a=function(e,t){t=D.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=D.ajaxSettings&&D.ajaxSettings.traditional),D.isArray(e)||e.jquery&&!D.isPlainObject(e))D.each(e,function(){a(this.name,this.value)});else for(n in e)v(n,e[n],t,a);return r.join("&").replace(de,"+")},D.fn.extend({serialize:function(){return D.param(this.serializeArray()); 3 | },serializeArray:function(){return this.map(function(){var e=D.prop(this,"elements");return e?D.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!D(this).is(":disabled")&&ve.test(this.nodeName)&&!he.test(e)&&(this.checked||!rcheckableType.test(e))}).map(function(e,t){var n=D(this).val();return null==n?null:D.isArray(n)?D.map(n,function(e){return{name:t.name,value:e.replace(pe,"\r\n")}}):{name:t.name,value:n.replace(pe,"\r\n")}}).get()}}),D.ajaxSettings.xhr=void 0!==window.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&y()||m()}:y;var ye=0,me={},ge=D.ajaxSettings.xhr();window.ActiveXObject&&D(window).on("unload",function(){for(var e in me)me[e](void 0,!0)}),C.cors=!!ge&&"withCredentials"in ge,ge=C.ajax=!!ge,ge&&D.ajaxTransport(function(e){if(!e.crossDomain||C.cors){var t;return{send:function(n,r){var a,i=e.xhr(),o=++ye;if(i.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)i[a]=e.xhrFields[a];e.mimeType&&i.overrideMimeType&&i.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(a in n)void 0!==n[a]&&i.setRequestHeader(a,n[a]+"");i.send(e.hasContent&&e.data||null),t=function(n,a){var s,c,u;if(t&&(a||4===i.readyState))if(delete me[o],t=void 0,i.onreadystatechange=D.noop,a)4!==i.readyState&&i.abort();else{u={},s=i.status,"string"==typeof i.responseText&&(u.text=i.responseText);try{c=i.statusText}catch(l){c=""}s||!e.isLocal||e.crossDomain?1223===s&&(s=204):s=u.text?200:404}u&&r(s,c,u,i.getAllResponseHeaders())},e.async?4===i.readyState?setTimeout(t):i.onreadystatechange=me[o]=t:t()},abort:function(){t&&t(void 0,!0)}}}}),D.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return D.globalEval(e),e}}}),D.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),D.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=q.head||D("head")[0]||q.documentElement;return{send:function(r,a){t=q.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||a(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var xe=[],be=/(=)\?(?=&|$)|\?\?/;return D.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=xe.pop()||D.expando+"_"+Y++;return this[e]=!0,e}}),D.ajaxPrefilter("json jsonp",function(e,t,n){var r,a,i,o=e.jsonp!==!1&&(be.test(e.url)?"url":"string"==typeof e.data&&!(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&be.test(e.data)&&"data");if(o||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=D.isFunction(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,o?e[o]=e[o].replace(be,"$1"+r):e.jsonp!==!1&&(e.url+=(G.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return i||D.error(r+" was not called"),i[0]},e.dataTypes[0]="json",a=window[r],window[r]=function(){i=arguments},n.always(function(){window[r]=a,e[r]&&(e.jsonpCallback=t.jsonpCallback,xe.push(r)),i&&D.isFunction(a)&&a(i[0]),i=a=void 0}),"script"}),D.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||q;var r=rsingleTag.exec(e),a=!n&&[];return r?[t.createElement(r[1])]:(r=D.buildFragment([e],t,a),a&&a.length&&D(a).remove(),D.merge([],r.childNodes))},D}(); 4 | var jsSHA=function(){function r(r,i,f){var s,l,E,b,v,g,A,d,F,w=0,R=[],B=0,U=!1,y=[],H=[],T=!1;if(f=f||{},s=f.encoding||"UTF8",F=f.numRounds||1,F!==parseInt(F,10)||1>F)throw Error("numRounds must a integer >= 1");if("SHA-1"!==r)throw Error("Chosen SHA variant is not supported");v=512,g=h,A=p,b=160,d=function(r){return r.slice()},E=u(i,s),l=c(r),this.setHMACKey=function(t,n,e){var o;if(!0===U)throw Error("HMAC key already set");if(!0===T)throw Error("Cannot set HMAC key after calling update");if(s=(e||{}).encoding||"UTF8",n=u(n,s)(t),t=n.binLen,n=n.value,o=v>>>3,e=o/4-1,ot/8){for(;n.length<=e;)n.push(0);n[e]&=4294967040}for(t=0;t<=e;t+=1)y[t]=909522486^n[t],H[t]=1549556828^n[t];l=g(y,l),w=v,U=!0},this.update=function(r){var t,n,e,o=0,a=v>>>5;for(t=E(r,R,B),r=t.binLen,n=t.value,t=r>>>5,e=0;e>>5),B=r%v,T=!0;var u=function(r){for(var t="",n=0;n<5;n++)for(var e=0;e<4;e++){var o=r[n]>>>8*e;o=255&o;var a=Number(o).toString(16);a=a.length<2?"0"+a:a,t+=a}return t};return u(l)},this.getHash=function(u,i){var f,s,h,p;if(!0===U)throw Error("Cannot call getHash after setting HMAC key");switch(h=a(i),u){case"HEX":f=function(r){return t(r,b,h)};break;case"B64":f=function(r){return n(r,b,h)};break;case"BYTES":f=function(r){return e(r,b)};break;case"ARRAYBUFFER":try{s=new ArrayBuffer(0)}catch(E){throw Error("ARRAYBUFFER not supported by this environment")}f=function(r){return o(r,b)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER")}for(p=A(R.slice(),B,w,d(l),b),s=1;s>>2]>>>8*(3+o%4*-1),e+="0123456789abcdef".charAt(a>>>4&15)+"0123456789abcdef".charAt(15&a);return n.outputUpper?e.toUpperCase():e}function n(r,t,n){var e,o,a,u="",i=t/8;for(e=0;e>>2]:0,a=e+2>>2]:0,a=(r[e>>>2]>>>8*(3+e%4*-1)&255)<<16|(o>>>8*(3+(e+1)%4*-1)&255)<<8|a>>>8*(3+(e+2)%4*-1)&255,o=0;4>o;o+=1)u+=8*e+6*o<=t?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(a>>>6*(3-o)&63):n.b64Pad;return u}function e(r,t){var n,e,o="",a=t/8;for(n=0;n>>2]>>>8*(3+n%4*-1)&255,o+=String.fromCharCode(e);return o}function o(r,t){var n,e=t/8,o=new ArrayBuffer(e);for(n=0;n>>2]>>>8*(3+n%4*-1)&255;return o}function a(r){var t={outputUpper:!1,b64Pad:"=",shakeLen:-1};if(r=r||{},t.outputUpper=r.outputUpper||!1,!0===r.hasOwnProperty("b64Pad")&&(t.b64Pad=r.b64Pad),"boolean"!=typeof t.outputUpper)throw Error("Invalid outputUpper formatting option");if("string"!=typeof t.b64Pad)throw Error("Invalid b64Pad formatting option");return t}function u(r,t){var n;switch(t){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(r){case"HEX":n=function(r,t,n){var e,o,a,u,i,f=r.length;if(0!==f%2)throw Error("String of HEX type must be in byte increments");for(t=t||[0],n=n||0,i=n>>>3,e=0;e>>1)+i,a=u>>>2;t.length<=a;)t.push(0);t[a]|=o<<8*(3+u%4*-1)}return{value:t,binLen:4*f+n}};break;case"TEXT":n=function(r,n,e){var o,a,u,i,f,s,c,h,p=0;if(n=n||[0],e=e||0,f=e>>>3,"UTF8"===t)for(h=3,u=0;uo?a.push(o):2048>o?(a.push(192|o>>>6),a.push(128|63&o)):55296>o||57344<=o?a.push(224|o>>>12,128|o>>>6&63,128|63&o):(u+=1,o=65536+((1023&o)<<10|1023&r.charCodeAt(u)),a.push(240|o>>>18,128|o>>>12&63,128|o>>>6&63,128|63&o)),i=0;i>>2;n.length<=s;)n.push(0);n[s]|=a[i]<<8*(h+c%4*-1),p+=1}else if("UTF16BE"===t||"UTF16LE"===t)for(h=2,u=0;u>>8),c=p+f,s=c>>>2;n.length<=s;)n.push(0);n[s]|=o<<8*(h+c%4*-1),p+=2}return{value:n,binLen:8*p+e}};break;case"B64":n=function(r,t,n){var e,o,a,u,i,f,s,c=0;if(-1===r.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");if(o=r.indexOf("="),r=r.replace(/\=/g,""),-1!==o&&o=0;i--){var s=localStorage.key(i),p=localStorage.getItem(s);r-p.update_time>a&&localStorage.removeItem(s)}localStorage.setItem(h,JSON.stringify(n))},y=function(e){try{var t=JSON.parse(localStorage.getItem(h))||{}}catch(a){}return t[e]},S=function(e,t,a){var n=this,o=new FormData,r=e.opt,i=r.file,s=r.slice_size,p=r.session,c=i.size,l=t.start,d=Math.min(l+s,c),f=n.slice.call(i,l,d),g=f.size,h=function(t){for(var a=e.uploadingAjax.length-1;a>=0;a--)t===e.uploadingAjax[a]&&e.uploadingAjax.splice(a,1)},v=0,y=function(t,a){e.loadedSize+=t-v,v=t,e.onTaskProgress&&e.onTaskProgress(a)},S=function(t){o.append("sliceSize",s),o.append("op","upload_slice_data"),o.append("session",p),o.append("offset",l),r.sha&&o.append("sha",r.sha),o.append("fileContent",f),n.getAppSign(function(a){r.sign=a;var i=n.getCgiUrl(r.path,r.sign),s=$.ajax({type:"POST",dataType:"JSON",url:i,data:o,xhr:function(){var t=$.ajaxSettings.xhr();return t.upload.onprogress=function(t){y(t.loaded),e.onTaskProgress&&e.onTaskProgress()},t},success:function(e){y(g,!0),e=e||{},0===e.code?t(null,e):t("error",e)},error:function(){y(0,!0),t("error")},complete:function(){h(s)},processData:!1,contentType:!1});e.uploadingAjax.push(s)})},m=function(t){"cancel"!==r.globalTask.state&&S(function(o,i){o?t>=n.uploadMaxRetryTimes||e.uploadError||"cancel"===r.globalTask.state?a(o,i):m(t+1):a(o,i)})};u(i,l,d,function(e){f=e,g=f.size,m(1)})};return e});})(); -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | /* global require */ 2 | var gulp = require('gulp'), gulpLoadPlugins = require('gulp-load-plugins'), plugins = gulpLoadPlugins(); 3 | var uglify = require('gulp-uglify'); 4 | var pkg = require('./package.json'); 5 | 6 | gulp.task('default', ['dev']); 7 | 8 | gulp.task('dev', ['build'], function () { 9 | gulp.watch('./src/*.js', ['build']); 10 | }); 11 | 12 | gulp.task('build', function () { 13 | gulp.src(['./src/*.js']) 14 | .pipe(plugins.replace("__VERSION__", pkg.version)) 15 | .pipe(uglify({})) 16 | .pipe(plugins.concat('cos-js-sdk-v4.js')) 17 | .pipe(plugins.header('/* <%=name%> <%=version%> */\n;(function(){', {name: pkg.name, version: pkg.version, date: (new Date).toLocaleString()})) 18 | .pipe(plugins.footer('})();')) 19 | .pipe(gulp.dest('./dist').on('finish', function () { 20 | console.log('concat done...'); 21 | })); 22 | }); 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cos-js-sdk-v4", 3 | "version": "1.2.1", 4 | "description": "js-sdk-v4 for 腾讯云对象存储服务", 5 | "main": "dist/cos-js-sdk-v4.js", 6 | "scripts": { 7 | "dev": "gulp" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/tencentyun/cos-js-sdk-v4.git" 12 | }, 13 | "keywords": [ 14 | "qcloud", 15 | "qcloud-sdk", 16 | "cos", 17 | "cos-sdk" 18 | ], 19 | "license": "ISC", 20 | "bugs": { 21 | "url": "https://github.com/tencentyun/cos-js-sdk-v4/issues" 22 | }, 23 | "homepage": "https://github.com/tencentyun/cos-js-sdk-v4#readme", 24 | "devDependencies": { 25 | "gulp": "^3.8.11", 26 | "gulp-concat": "^2.5.2", 27 | "gulp-footer": "^1.0.5", 28 | "gulp-header": "^1.8.8", 29 | "gulp-load-plugins": "^0.10.0", 30 | "gulp-replace": "^0.6.1", 31 | "gulp-uglify": "^1.5.4" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/jssha.js: -------------------------------------------------------------------------------- 1 | /* 2 | A JavaScript implementation of the SHA family of hashes, as 3 | defined in FIPS PUB 180-4 and FIPS PUB 202, as well as the corresponding 4 | HMAC implementation as defined in FIPS PUB 198a 5 | Copyright Brian Turek 2008-2016 6 | Distributed under the BSD License 7 | See http://caligatio.github.com/jsSHA/ for more information 8 | Several functions taken from Paul Johnston 9 | */ 10 | var jsSHA = (function(){function r(d,b,c){var h=0,a=[],g=0,f,m,k,e,l,p,q,t,w=!1,n=[],u=[],v,r=!1;c=c||{};f=c.encoding||"UTF8";v=c.numRounds||1;if(v!==parseInt(v,10)||1>v)throw Error("numRounds must a integer >= 1");if("SHA-1"===d)l=512,p=z,q=H,e=160,t=function(a){return a.slice()};else throw Error("Chosen SHA variant is not supported");k=A(b,f);m=x(d);this.setHMACKey=function(a,b,g){var c;if(!0===w)throw Error("HMAC key already set");if(!0===r)throw Error("Cannot set HMAC key after calling update"); 11 | f=(g||{}).encoding||"UTF8";b=A(b,f)(a);a=b.binLen;b=b.value;c=l>>>3;g=c/4-1;if(ca/8){for(;b.length<=g;)b.push(0);b[g]&=4294967040}for(a=0;a<=g;a+=1)n[a]=b[a]^909522486,u[a]=b[a]^1549556828;m=p(n,m);h=l;w=!0};this.update=function(b){var e,f,c,d=0,q=l>>>5;e=k(b,a,g);b=e.binLen;f=e.value;e=b>>>5;for(c=0;c>>5);g=b%l;r=!0;var formatFunc=function(c){var g="";for(var d=0;d<5;d++){for(var f=0;f<4;f++){var a=c[d]>>>(f*8);a=a&255;var e=Number(a).toString(16);e=e.length<2?"0"+e:e;g+=e}}return g};return formatFunc(m)};this.getHash=function(b,f){var c,k,l,p;if(!0=== 12 | w)throw Error("Cannot call getHash after setting HMAC key");l=B(f);switch(b){case "HEX":c=function(a){return C(a,e,l)};break;case "B64":c=function(a){return D(a,e,l)};break;case "BYTES":c=function(a){return E(a,e)};break;case "ARRAYBUFFER":try{k=new ArrayBuffer(0)}catch(I){throw Error("ARRAYBUFFER not supported by this environment");}c=function(a){return F(a,e)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");}p=q(a.slice(),g,h,t(m),e);for(k=1;k>>2]>>>8*(3+a%4*-1),h+="0123456789abcdef".charAt(g>>>4&15)+"0123456789abcdef".charAt(g&15);return c.outputUpper?h.toUpperCase():h}function D(d,b,c){var h="",a=b/8,g,f,m;for(g=0;g>>2]:0,m=g+2>>2]:0,m=(d[g>>>2]>>>8*(3+g%4*-1)&255)<<16|(f>>>8*(3+(g+1)%4*-1)&255)<<8|m>>>8*(3+(g+2)%4*-1)&255,f=0;4>f;f+=1)8*g+6*f<=b?h+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(m>>> 15 | 6*(3-f)&63):h+=c.b64Pad;return h}function E(d,b){var c="",h=b/8,a,g;for(a=0;a>>2]>>>8*(3+a%4*-1)&255,c+=String.fromCharCode(g);return c}function F(d,b){var c=b/8,h,a=new ArrayBuffer(c);for(h=0;h>>2]>>>8*(3+h%4*-1)&255;return a}function B(d){var b={outputUpper:!1,b64Pad:"=",shakeLen:-1};d=d||{};b.outputUpper=d.outputUpper||!1;!0===d.hasOwnProperty("b64Pad")&&(b.b64Pad=d.b64Pad);if("boolean"!==typeof b.outputUpper)throw Error("Invalid outputUpper formatting option");if("string"!== 16 | typeof b.b64Pad)throw Error("Invalid b64Pad formatting option");return b}function A(d,b){var c;switch(b){case "UTF8":case "UTF16BE":case "UTF16LE":break;default:throw Error("encoding must be UTF8, UTF16BE, or UTF16LE");}switch(d){case "HEX":c=function(b,a,g){var f=b.length,c,d,e,l,p;if(0!==f%2)throw Error("String of HEX type must be in byte increments");a=a||[0];g=g||0;p=g>>>3;for(c=0;c>>1)+p;for(e=l>>>2;a.length<=e;)a.push(0);a[e]|=d<<8*(3+l%4*-1)}return{value:a,binLen:4*f+g}};break;case "TEXT":c=function(c,a,g){var f,d,k=0,e,l,p,q,t,n;a=a||[0];g=g||0;p=g>>>3;if("UTF8"===b)for(n=3,e=0;ef?d.push(f):2048>f?(d.push(192|f>>>6),d.push(128|f&63)):55296>f||57344<=f?d.push(224|f>>>12,128|f>>>6&63,128|f&63):(e+=1,f=65536+((f&1023)<<10|c.charCodeAt(e)&1023),d.push(240|f>>>18,128|f>>>12&63,128|f>>>6&63,128|f&63)),l=0;l>>2;a.length<=q;)a.push(0);a[q]|=d[l]<<8*(n+t%4*-1);k+=1}else if("UTF16BE"===b||"UTF16LE"===b)for(n=2,e=0;e>>8);t=k+p;for(q=t>>>2;a.length<=q;)a.push(0);a[q]|=f<<8*(n+t%4*-1);k+=2}return{value:a,binLen:8*k+g}};break;case "B64":c=function(b,a,c){var f=0,d,k,e,l,p,q,n;if(-1===b.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");k=b.indexOf("=");b=b.replace(/\=/g,"");if(-1!==k&&k parseInt(b[i]) ? 1 : -1; 15 | } 16 | } 17 | return 0; 18 | }; 19 | var check = function (ua) { 20 | var ChromeVersion = (ua.match(/Chrome\/([.\d]+)/) || [])[1]; 21 | var QBCoreVersion = (ua.match(/QBCore\/([.\d]+)/) || [])[1]; 22 | var QQBrowserVersion = (ua.match(/QQBrowser\/([.\d]+)/) || [])[1]; 23 | var need = ChromeVersion && compareVersion(ChromeVersion, '53.0.2785.116') < 0 24 | && QBCoreVersion && compareVersion(QBCoreVersion, '3.53.991.400') < 0 25 | && QQBrowserVersion && compareVersion(QQBrowserVersion, '9.0.2524.400') <= 0 || false; 26 | return need; 27 | }; 28 | return check(navigator.userAgent); 29 | })(); 30 | var fileSliceCopy = function (file, start, end, callback) { 31 | var blob; 32 | if (file.slice) { 33 | blob = file.slice(start, end); 34 | } else if (file.mozSlice) { 35 | blob = file.mozSlice(start, end); 36 | } else if (file.webkitSlice) { 37 | blob = file.webkitSlice(start, end); 38 | } 39 | if (fileSliceNeedCopy) { 40 | var reader = new FileReader(); 41 | reader.onload = function (e) { 42 | callback(new Blob([reader.result])); 43 | }; 44 | reader.readAsArrayBuffer(blob); 45 | } else { 46 | callback(blob); 47 | } 48 | }; 49 | 50 | function CosCloud(opt) { 51 | this.appid = opt.appid; 52 | this.bucket = opt.bucket; 53 | this.region = opt.region; 54 | 55 | this.sha1CacheExpired = 3 * 24 * 3600; 56 | this.uploadMaxThread = 5; 57 | this.uploadMaxRetryTimes = 3; 58 | 59 | this._uploadingThreadCount = 0; 60 | this.tasks = []; 61 | 62 | if (opt.getAppSign) { 63 | this.getAppSign = getEncodeFn(opt.getAppSign, this); 64 | } 65 | if (opt.getAppSignOnce) { 66 | this.getAppSignOnce = getEncodeFn(opt.getAppSignOnce, this); 67 | } 68 | } 69 | 70 | function getEncodeFn(fn, context) { 71 | return function (callback) { 72 | fn.call(context, function (s) { 73 | if (decodeURIComponent(s) === s) { 74 | s = encodeURIComponent(s); 75 | } 76 | callback(s); 77 | }); 78 | }; 79 | } 80 | 81 | //512K 82 | var SLICE_SIZE_512K = 1024 * 512; 83 | //1M 84 | var SLICE_SIZE_1M = 1024 * 1024; 85 | //2M 86 | var SLICE_SIZE_2M = 1024 * 1024 * 2; 87 | //3M 88 | var SLICE_SIZE_3M = 1024 * 1024 * 3; 89 | //20M 大于20M的文件需要进行分片传输 90 | var MAX_UNSLICE_FILE_SIZE = 1024 * 1024 * 20; 91 | 92 | CosCloud.version = '__VERSION__'; 93 | CosCloud.prototype.cosapi_cgi_url = (location.protocol === 'https:' ? 'https:' : 'http:') + "//REGION.file.myqcloud.com/files/v2/"; 94 | CosCloud.prototype.slice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice; 95 | CosCloud.prototype.sliceSize = 3 * 1024 * 1024; 96 | CosCloud.prototype.getExpired = function (second) { 97 | return new Date().getTime() / 1000 + (second || 60); 98 | }; 99 | 100 | /** 101 | * 分片上传获取size 102 | * @param {int} size 文件分片大小,Bytes 103 | * return {int} size 文件分片大小,Bytes 104 | */ 105 | CosCloud.prototype.getSliceSize = function (size) { 106 | var res = SLICE_SIZE_1M; 107 | 108 | if (size <= SLICE_SIZE_512K) { 109 | res = SLICE_SIZE_512K; 110 | } else if (size <= SLICE_SIZE_1M) { 111 | res = SLICE_SIZE_1M; 112 | } else { 113 | res = SLICE_SIZE_1M; 114 | } 115 | 116 | 117 | return res; 118 | 119 | }; 120 | 121 | 122 | CosCloud.prototype.set = function (opt) { 123 | 124 | if (opt) { 125 | this.appid = opt.appid; 126 | this.bucket = opt.bucket; 127 | this.region = opt.region; 128 | if (opt.getAppSign) { 129 | this.getAppSign = opt.getAppSign; 130 | } 131 | if (opt.getAppSignOnce) { 132 | this.getAppSignOnce = opt.getAppSignOnce; 133 | } 134 | } 135 | }; 136 | 137 | CosCloud.prototype.getCgiUrl = function (destPath, sign) { 138 | var region = this.region; 139 | var bucket = this.bucket; 140 | var url = this.cosapi_cgi_url; 141 | url = url.replace('REGION', region); 142 | 143 | return url + this.appid + '/' + bucket + '/' + destPath + '?sign=' + sign; 144 | 145 | }; 146 | 147 | 148 | CosCloud.prototype.getAppSign = function (success, error, bucketName) { 149 | var expired = this.getExpired(); 150 | var url = this.sign_url + "?sign_type=appSign&expired=" + expired + "&bucketName=" + bucketName; 151 | $.ajax({ 152 | url: url, 153 | type: "GET", 154 | success: success, 155 | error: error 156 | }); 157 | }; 158 | 159 | CosCloud.prototype.getAppSignOnce = function (success, error, path, bucketName) { 160 | var url = this.sign_url + "?sign_type=appSign_once&path=" + encodeURIComponent(path) + "&bucketName=" + bucketName; 161 | $.ajax({ 162 | url: url, 163 | type: "GET", 164 | success: success, 165 | error: error 166 | }); 167 | }; 168 | 169 | CosCloud.prototype.updateFolder = function (success, error, bucketName, remotePath, bizAttribute) { 170 | remotePath = fixPath.call(this, remotePath, 'folder'); 171 | this.updateBase(success, error, bucketName, remotePath, bizAttribute); 172 | }; 173 | 174 | CosCloud.prototype.updateFile = function (success, error, bucketName, remotePath, bizAttribute, authority, customHeaders) { 175 | remotePath = fixPath.call(this, remotePath); 176 | this.updateBase(success, error, bucketName, remotePath, bizAttribute, authority, customHeaders); 177 | }; 178 | 179 | CosCloud.prototype.updateBase = function (success, error, bucketName, remotePath, bizAttribute, authority, customHeaders) { 180 | var that = this; 181 | that.getAppSignOnce(function (sign) { 182 | var url = that.getCgiUrl(remotePath, sign); 183 | 184 | var formData = new FormData(); 185 | formData.append('op', 'update'); 186 | 187 | if (bizAttribute) { 188 | formData.append('biz_attr', bizAttribute); 189 | } 190 | //authority 权限类型,可选参数,可选值为eInvalid,eWRPrivate,eWPrivateRPublic 191 | // 文件可以与bucket拥有不同的权限类型,已经设置过权限的文件如果想要撤销,直接赋值为eInvalid,则会采用bucket的权限 192 | if (authority) { 193 | formData.append('authority', authority); 194 | } 195 | 196 | if (customHeaders) { 197 | customHeaders = JSON.stringify(customHeaders); 198 | formData.append('custom_headers', customHeaders); 199 | } 200 | 201 | $.ajax({ 202 | type: 'POST', 203 | url: url, 204 | processData: false, 205 | contentType: false, 206 | data: formData, 207 | success: success, 208 | error: error 209 | }); 210 | }); 211 | }; 212 | 213 | CosCloud.prototype.deleteFolder = function (success, error, bucketName, remotePath) { 214 | remotePath = fixPath.call(this, remotePath, 'folder'); 215 | this.deleteBase(success, error, bucketName, remotePath); 216 | }; 217 | 218 | CosCloud.prototype.deleteFile = function (success, error, bucketName, remotePath) { 219 | remotePath = fixPath.call(this, remotePath); 220 | this.deleteBase(success, error, bucketName, remotePath); 221 | }; 222 | 223 | CosCloud.prototype.deleteBase = function (success, error, bucketName, remotePath) { 224 | if (remotePath == "/") { 225 | error({"code": 10003, "message": "不能删除Bucket"}); 226 | return; 227 | } 228 | var that = this; 229 | this.getAppSignOnce(function (sign) { 230 | var url = that.getCgiUrl(remotePath, sign); 231 | var formData = new FormData(); 232 | formData.append('op', 'delete'); 233 | $.ajax({ 234 | type: 'POST', 235 | url: url, 236 | data: formData, 237 | processData: false, 238 | contentType: false, 239 | success: success, 240 | error: error 241 | }); 242 | }); 243 | }; 244 | 245 | CosCloud.prototype.getFolderStat = function (success, error, bucketName, remotePath) { 246 | remotePath = fixPath(remotePath, 'folder'); 247 | this.statBase(success, error, bucketName, remotePath); 248 | }; 249 | 250 | CosCloud.prototype.getFileStat = function (success, error, bucketName, remotePath) { 251 | remotePath = fixPath(remotePath); 252 | this.statBase(success, error, bucketName, remotePath); 253 | }; 254 | 255 | CosCloud.prototype.statBase = function (success, error, bucketName, remotePath) { 256 | var that = this; 257 | this.getAppSign.call(that, function (sign) { 258 | var url = that.getCgiUrl(remotePath, sign); 259 | var data = { 260 | op: "stat" 261 | }; 262 | $.ajax({ 263 | url: url, 264 | type: "GET", 265 | data: data, 266 | success: success, 267 | error: error 268 | }); 269 | }); 270 | 271 | }; 272 | 273 | CosCloud.prototype.createFolder = function (success, error, bucketName, remotePath, bizAttr) { 274 | var that = this; 275 | this.getAppSign(function (sign) { 276 | remotePath = fixPath(remotePath, 'folder'); 277 | var url = that.getCgiUrl(remotePath, sign); 278 | var formData = new FormData(); 279 | formData.append('op', 'create'); 280 | formData.append('biz_attr', bizAttr || ''); 281 | $.ajax({ 282 | type: 'POST', 283 | url: url, 284 | data: formData, 285 | processData: false, 286 | contentType: false, 287 | success: success, 288 | error: error 289 | }); 290 | }); 291 | }; 292 | 293 | CosCloud.prototype.copyFile = function (success, error, bucketName, remotePath, destPath, overWrite) { 294 | var that = this; 295 | this.getAppSign(function (sign) { 296 | remotePath = fixPath(remotePath); 297 | var url = that.getCgiUrl(remotePath, sign); 298 | var formData = new FormData(); 299 | formData.append('op', 'copy'); 300 | formData.append('dest_fileid', destPath); 301 | formData.append('to_over_write', overWrite); 302 | 303 | $.ajax({ 304 | type: 'POST', 305 | url: url, 306 | data: formData, 307 | processData: false, 308 | contentType: false, 309 | success: success, 310 | error: error 311 | }); 312 | }); 313 | }; 314 | 315 | CosCloud.prototype.moveFile = function (success, error, bucketName, remotePath, destPath, overWrite) { 316 | var that = this; 317 | this.getAppSign(function (sign) { 318 | remotePath = fixPath(remotePath); 319 | var url = that.getCgiUrl(remotePath, sign); 320 | var formData = new FormData(); 321 | formData.append('op', 'move'); 322 | formData.append('dest_fileid', destPath); 323 | formData.append('to_over_write', overWrite); 324 | 325 | $.ajax({ 326 | type: 'POST', 327 | url: url, 328 | data: formData, 329 | processData: false, 330 | contentType: false, 331 | success: success, 332 | error: error 333 | }); 334 | }); 335 | }; 336 | 337 | CosCloud.prototype.getFolderList = function (success, error, bucketName, remotePath, num, context, order, pattern, prefix) { 338 | var that = this; 339 | 340 | remotePath = fixPath(remotePath, 'folder'); 341 | 342 | that.listBase(success, error, bucketName, remotePath, num, context, order, pattern); 343 | }; 344 | 345 | CosCloud.prototype.listBase = function (success, error, bucketName, remotePath, num, context, order, pattern, prefix) { 346 | var that = this; 347 | that.getAppSign(function (sign) { 348 | var url = that.getCgiUrl(remotePath, sign); 349 | 350 | num = num || 20; 351 | order = order || 0; 352 | pattern = pattern || 'eListBoth'; 353 | 354 | var data = { 355 | op: "list", 356 | num: num, 357 | context: context, 358 | order: order, 359 | pattern: pattern 360 | }; 361 | $.ajax({ 362 | url: url, 363 | type: "GET", 364 | data: data, 365 | success: success, 366 | error: error 367 | }); 368 | }); 369 | }; 370 | 371 | CosCloud.prototype.uploadFile = function (success, error, onprogress, bucketName, remotePath, file, insertOnly, taskReady) { 372 | 373 | var that = this; 374 | if (file.size > MAX_UNSLICE_FILE_SIZE) { 375 | that.sliceUploadFile(success, error, onprogress, bucketName, remotePath, file, insertOnly, undefined, undefined, taskReady); 376 | return; 377 | } 378 | 379 | if (remotePath.substr(remotePath.length - 1) === '/') { 380 | error({code: -1, message: 'path not allow end with "/"'}); 381 | return; 382 | } 383 | remotePath = fixPath(remotePath); 384 | 385 | // 辅助 cancelTask 386 | var taskId = guid(); 387 | var $xhr; 388 | var globalTask = { 389 | id: taskId, 390 | state: 'uploading', 391 | cancel: function () { 392 | $xhr && $xhr.abort(); 393 | } 394 | }; 395 | this.tasks[taskId] = globalTask; 396 | taskReady && typeof taskReady === 'function' && taskReady(taskId); 397 | 398 | that.getAppSign(function (sign) { 399 | var url = that.getCgiUrl(remotePath, sign); 400 | var formData = new FormData(); 401 | insertOnly = insertOnly === 0 ? 0 : 1; 402 | formData.append('op', 'upload'); 403 | formData.append('fileContent', file); 404 | formData.append('insertOnly', insertOnly); 405 | $xhr = $.ajax({ 406 | type: 'POST', 407 | url: url, 408 | data: formData, 409 | processData: false, 410 | contentType: false, 411 | xhr: function () { 412 | 413 | var xhr = $.ajaxSettings.xhr(); 414 | xhr.upload.onprogress = function (evt) { 415 | var percent = evt.loaded / evt.total; 416 | if (typeof onprogress === 'function') { 417 | onprogress(percent, 0); 418 | } 419 | }; 420 | 421 | return xhr; 422 | 423 | }, 424 | success: function () { 425 | if (globalTask.state === 'cancel') return; 426 | success.apply(this, arguments); 427 | }, 428 | error: function () { 429 | if (globalTask.state === 'cancel') return; 430 | success.apply(this, arguments); 431 | } 432 | }); 433 | }); 434 | }; 435 | 436 | CosCloud.prototype.sliceUploadFile = function (success, error, onprogress, bucketName, remotePath, file, insertOnly, optSliceSize, bizAttr, taskReady) { 437 | 438 | if (remotePath.substr(remotePath.length - 1) === '/') { 439 | error({code: -1, message: 'path not allow end with "/"'}); 440 | return; 441 | } 442 | 443 | // 辅助 cancelTask 444 | var taskId = guid(); 445 | var globalTask = { 446 | id: taskId, 447 | state: 'uploading', 448 | cancelRequests: null, 449 | cancel: function () { 450 | globalTask.cancelRequests && globalTask.cancelRequests(); 451 | }, 452 | }; 453 | this.tasks[taskId] = globalTask; 454 | taskReady && typeof taskReady === 'function' && taskReady(taskId); 455 | 456 | var that = this; 457 | remotePath = fixPath(remotePath); 458 | that.getAppSign(function (sign) { 459 | var opt = {}; 460 | opt.globalTask = globalTask; 461 | if (opt.globalTask.state === 'cancel') return; 462 | optSliceSize = that.getSliceSize(optSliceSize); 463 | opt.bucket = bucketName; 464 | opt.path = remotePath; 465 | opt.file = file; 466 | opt.insertOnly = insertOnly === 0 ? 0 : 1; 467 | opt.sliceSize = optSliceSize || 1024 * 1024;//分片不设置的话固定1M大小 468 | opt.appid = that.appid; 469 | opt.sign = sign; 470 | opt.biz_attr = bizAttr || ''; 471 | opt.onprogress = function (uploaded, sha1Check) { 472 | if (sha1Check === undefined) sha1Check = 1; 473 | onprogress(uploaded, sha1Check); 474 | }; 475 | 476 | //先查看是否有上传过分片 477 | sliceList.call(that, opt).always(function (res) { 478 | if (opt.globalTask.state === 'cancel') return; 479 | 480 | res = res || {}; 481 | var data = res.data; 482 | if (data && data.session) { // 之前上传过,直接开始上传剩下的分片 483 | if (data.filesize !== opt.file.size) { 484 | return error({code: -1, message: 'filesize not match'}); 485 | } 486 | 487 | var listparts = opt.listparts || []; 488 | opt.session = data.session; 489 | opt.listparts = listparts; 490 | if (listparts && listparts.length) { 491 | var len = listparts.length; 492 | opt.offset = listparts[len - 1].offset; 493 | } 494 | if (data.sha) { 495 | opt.onlineSha = data.sha.split('_')[0]; 496 | } 497 | getSliceSHA1.call(that, opt).done(function (uploadparts) { 498 | if (opt.globalTask.state === 'cancel') return; 499 | 500 | opt.uploadparts = uploadparts; 501 | var len = uploadparts.length; 502 | opt.sha = uploadparts[len - 1].datasha; 503 | 504 | sliceUpload.call(that, opt).done(function () { 505 | sliceFinish.call(that, opt).done(function (r) { 506 | success(r); 507 | }).fail(function (d) { 508 | error({code: -1, message: d && d.message || 'slice finish error'}); 509 | }); 510 | }).fail(function (d) { 511 | error({code: -1, message: (d && d.message) || 'slice upload file error'}); 512 | }); 513 | 514 | }).fail(function (errMsg) { 515 | error({code: -1, message: errMsg || 'get slice sha1 error'}); 516 | }); 517 | } else if (data && data.access_url && insertOnly !== 0) { // 已存在文件,并且不允许覆盖 518 | // insertOnly === 0 表示覆盖文件,否则不覆盖 519 | if (typeof opt.onprogress === 'function') { 520 | opt.onprogress(1, 0); 521 | } 522 | success(res); 523 | } else { // 之前没上传,进行sliceInit开启上传 524 | getSliceSHA1.call(that, opt).done(function (uploadparts) { 525 | if (opt.globalTask.state === 'cancel') return; 526 | 527 | opt.uploadparts = uploadparts; 528 | var len = uploadparts.length; 529 | opt.sha = uploadparts[len - 1].datasha; 530 | 531 | sliceInit.call(that, opt).done(function (res) { 532 | if (opt.globalTask.state === 'cancel') return; 533 | 534 | res = res || {}; 535 | var data = res.data || {}; 536 | 537 | if (data && data.access_url) { // 之前已经上传完成 538 | if (typeof opt.onprogress === 'function') { 539 | opt.onprogress(1, 0); 540 | } 541 | success(res); 542 | } else { 543 | sliceFinish.call(that, opt).done(function (r) { 544 | success(r); 545 | }).fail(function (d) { 546 | error({ 547 | code: -1, 548 | message: d.message || 'slice finish error' 549 | }); 550 | }); 551 | } 552 | 553 | }).fail(function (d) { 554 | d = d || {}; 555 | error({ 556 | code: d.code || -1, 557 | message: d.message || 'upload slice file error' 558 | }); 559 | }); 560 | }).fail(function () { 561 | error({ 562 | code: -1, 563 | message: 'get slice sha1 error' 564 | }); 565 | }); 566 | } 567 | }); 568 | 569 | }); 570 | 571 | }; 572 | 573 | CosCloud.prototype.cancelTask = function (taskId) { 574 | var task = this.tasks[taskId]; 575 | if (task) { 576 | task.state = 'cancel'; 577 | task.cancel(); 578 | } 579 | }; 580 | 581 | // 获取唯一 id 582 | function guid() { 583 | function s4() { 584 | return Math.floor((1 + Math.random()) * 0x10000) 585 | .toString(16) 586 | .substring(1); 587 | } 588 | return s4() + s4() + '-' + s4() + '-' + s4() + '-' + 589 | s4() + '-' + s4() + s4() + s4(); 590 | } 591 | 592 | //处理路径 593 | function fixPath(path, type) { 594 | 595 | if (!path) { 596 | return ''; 597 | } 598 | var self = this; 599 | path = path.replace(/(^\/*)/g, ''); 600 | if (type == 'folder') { 601 | path = encodeURIComponent(path + '/').replace(/%2F/g, '/'); 602 | } else { 603 | path = encodeURIComponent(path).replace(/%2F/g, '/'); 604 | } 605 | 606 | if (self) { 607 | self.path = '/' + self.appid + '/' + self.bucket + '/' + path; 608 | } 609 | 610 | return path; 611 | } 612 | 613 | var REM_SHA1_KEY = '_cos_sdk_sha1_'; 614 | var rememberSha1 = function (session, sha1Samples, sha1CacheExpired) { 615 | try { 616 | var data = JSON.parse(localStorage.getItem(REM_SHA1_KEY)) || {}; 617 | } catch (e) { 618 | } 619 | var current = Date.now(); 620 | sha1Samples['update_time'] = current; 621 | data[session] = sha1Samples; 622 | // 删除太旧的数据 623 | for (var i = localStorage.length - 1; i >= 0; i--) { 624 | var key = localStorage.key(i); 625 | var item = localStorage.getItem(key); 626 | if (current - item['update_time'] > sha1CacheExpired) { 627 | localStorage.removeItem(key) 628 | } 629 | } 630 | localStorage.setItem(REM_SHA1_KEY, JSON.stringify(data)); 631 | }; 632 | var restoreSha1 = function (session) { 633 | try { 634 | var data = JSON.parse(localStorage.getItem(REM_SHA1_KEY)) || {}; 635 | } catch (e) { 636 | } 637 | return data[session]; 638 | }; 639 | 640 | //获取分片sha1值数组 641 | function getSliceSHA1(opt) { 642 | var defer = $.Deferred(); 643 | 644 | var sha1Algo = new jsSHA('SHA-1', 'BYTES'); 645 | var read = 0; 646 | var unit = opt.sliceSize; 647 | var reader = new FileReader(); 648 | var uploadParts = []; 649 | var file = opt.file; 650 | var fileSize = file.size; 651 | 652 | // 获取已存在的 session sha1 抽样 653 | var sha1Samples; 654 | if (opt.session) { 655 | sha1Samples = restoreSha1(opt.session); 656 | } 657 | 658 | var pushPartAndCheck = function (part) { 659 | uploadParts.push(part); 660 | // 判读是否和已存在的文件不一致,如果不一致马上结束计算 661 | var sha1Index = part.offset + '-' + part.datalen; 662 | if (sha1Samples && sha1Samples[sha1Index]) { 663 | if (part.datasha !== sha1Samples[sha1Index]) { 664 | return false; 665 | } 666 | } 667 | return true; 668 | }; 669 | 670 | //为了避免内存可能过大,尝试分块读取文件并计算 671 | reader.onload = function (e) { 672 | if (opt.globalTask.state === 'cancel') return; 673 | if (!file || file.length < 1) return; 674 | 675 | // 计算当次分块的 sha1 值 676 | var middle = sha1Algo.update(this.content || this.result); 677 | 678 | // 获取当前分块的长度 679 | var len = read + unit > fileSize ? fileSize - read : unit; 680 | var notEnd = read + len < fileSize; 681 | var sha1 = notEnd ? middle : sha1Algo.getHash('HEX'); // 最后一块特殊处理 682 | 683 | // 保存每次计算得到的 sha1 684 | if (!pushPartAndCheck({offset: read, datalen: len, datasha: sha1})) { 685 | defer.reject('sha1 not match'); 686 | return; 687 | } 688 | 689 | // 更新已完成百分比 690 | read = read + len; 691 | opt.onprogress(0, read / fileSize); 692 | 693 | // 循环读文件,到最后一块处理完之后,回调所有分片数据 694 | if (notEnd) { 695 | readAsBinStr.call(reader, file.slice(read, Math.min(read + unit, fileSize))); 696 | } else { 697 | defer.resolve(uploadParts); 698 | } 699 | }; 700 | readAsBinStr.call(reader, file.slice(read, read + unit)); 701 | 702 | reader.onerror = function () { 703 | defer.reject(); 704 | }; 705 | 706 | 707 | return defer.promise(); 708 | } 709 | 710 | //slice upload init 711 | function sliceInit(opt) { 712 | var defer = $.Deferred(); 713 | var file = opt.file; 714 | var that = this; 715 | 716 | var url = this.getCgiUrl(opt.path, opt.sign); 717 | 718 | var formData = new FormData(); 719 | var uploadparts = opt.uploadparts; 720 | formData.append('uploadparts', JSON.stringify(uploadparts)); 721 | formData.append('sha', opt.sha); 722 | formData.append('op', 'upload_slice_init'); 723 | formData.append('filesize', file.size); 724 | formData.append('slice_size', opt.sliceSize); 725 | formData.append('biz_attr', opt.biz_attr); 726 | formData.append('insertOnly', opt.insertOnly); 727 | 728 | $.ajax({ 729 | type: 'POST', 730 | dataType: "JSON", 731 | url: url, 732 | data: formData, 733 | success: function (res) { 734 | if (opt.globalTask.state === 'cancel') return; 735 | res = res || {}; 736 | if (res.code == 0) { 737 | 738 | if (res.data.access_url) {//如果秒传命中则直接返回 739 | defer.resolve(res); 740 | return; 741 | } 742 | var session = res.data.session; 743 | var sliceSize = parseInt(res.data.slice_size); 744 | 745 | var offset = res.data.offset || 0; 746 | 747 | opt.session = session; 748 | opt.slice_size = sliceSize; 749 | opt.offset = offset; 750 | 751 | sliceUpload.call(that, opt).done(function (r) { 752 | defer.resolve(r); 753 | }).fail(function (r) { 754 | defer.reject(r); 755 | }); 756 | 757 | // 保存正在上传的 session 文件分片 sha1,用于下一次续传优化判断是否不一样的文件 758 | var sItem, sha1Samples = {}; 759 | for (var i = 1; i < opt.uploadparts.length; i *= 2) { 760 | sItem = opt.uploadparts[i - 1]; 761 | sha1Samples[sItem.offset + '-' + sItem.datalen] = sItem.datasha; 762 | } 763 | sItem = opt.uploadparts[opt.uploadparts.length - 1]; 764 | sha1Samples[sItem.offset + '-' + sItem.datalen] = sItem.datasha; 765 | rememberSha1(opt.session, sha1Samples, that.sha1CacheExpired); 766 | 767 | } else { 768 | defer.reject(res); 769 | } 770 | }, 771 | error: function () { 772 | defer.reject(); 773 | }, 774 | processData: false, 775 | contentType: false 776 | }); 777 | 778 | return defer.promise(); 779 | } 780 | 781 | 782 | // 上传单个分片,分片失败重传 3 次 783 | var uploadSingleChunk = function (task, chunk, callback) { 784 | var that = this; 785 | var formData = new FormData(); 786 | var opt = task.opt; 787 | var file = opt.file; 788 | var slice_size = opt.slice_size; 789 | var session = opt.session; 790 | var totalSize = file.size; 791 | var offsetStart = chunk.start; 792 | var offsetEnd = Math.min(offsetStart + slice_size, totalSize); 793 | var blob = that.slice.call(file, offsetStart, offsetEnd); 794 | var chunkSize = blob.size; 795 | 796 | var removeXhr = function (xhr) { 797 | for (var i = task.uploadingAjax.length - 1; i >= 0; i--) { 798 | if (xhr === task.uploadingAjax[i]) { 799 | task.uploadingAjax.splice(i, 1); 800 | } 801 | } 802 | }; 803 | var preLoaded = 0; 804 | var updateProgress = function (loaded, immediately) { 805 | task.loadedSize += loaded - preLoaded; 806 | preLoaded = loaded; 807 | task.onTaskProgress && task.onTaskProgress(immediately); 808 | }; 809 | var uploadChunk = function (cb) { 810 | formData.append('sliceSize', slice_size); 811 | formData.append('op', 'upload_slice_data'); 812 | formData.append('session', session); 813 | formData.append('offset', offsetStart); 814 | opt.sha && formData.append('sha', opt.sha); 815 | formData.append('fileContent', blob); 816 | 817 | that.getAppSign(function (sign) { 818 | opt.sign = sign; 819 | var url = that.getCgiUrl(opt.path, opt.sign); 820 | 821 | var ajax = $.ajax({ 822 | type: 'POST', 823 | dataType: "JSON", 824 | url: url, 825 | data: formData, 826 | xhr: function () { 827 | var xhr = $.ajaxSettings.xhr(); 828 | xhr.upload.onprogress = function (evt) { 829 | updateProgress(evt.loaded); 830 | task.onTaskProgress && task.onTaskProgress(); 831 | }; 832 | return xhr; 833 | }, 834 | success: function (res) { 835 | updateProgress(chunkSize, true); 836 | res = res || {}; 837 | if (res.code === 0) { 838 | cb(null, res); 839 | } else { 840 | cb('error', res); 841 | } 842 | }, 843 | error: function () { 844 | updateProgress(0, true); 845 | cb('error'); 846 | }, 847 | complete: function () { 848 | removeXhr(ajax); 849 | }, 850 | processData: false, 851 | contentType: false 852 | }); 853 | task.uploadingAjax.push(ajax); 854 | }); 855 | }; 856 | 857 | // 失败重试 3 次 858 | var tryUpload = function (times) { 859 | if (opt.globalTask.state === 'cancel') return; 860 | uploadChunk(function (err, data) { 861 | if (err) { // fail, retry 862 | if (times >= that.uploadMaxRetryTimes || task.uploadError || opt.globalTask.state === 'cancel') { 863 | callback(err, data); 864 | } else { 865 | tryUpload(times + 1); 866 | } 867 | } else { // success 868 | callback(err, data); 869 | } 870 | }); 871 | }; 872 | fileSliceCopy(file, offsetStart, offsetEnd, function (newBlob) { 873 | blob = newBlob; 874 | chunkSize = blob.size; 875 | tryUpload(1); 876 | }); 877 | 878 | }; 879 | 880 | 881 | // 分片上传单个文件 882 | function sliceUpload(opt) { 883 | 884 | var that = this; 885 | var file = opt.file; 886 | var defer = $.Deferred(); 887 | 888 | // 整理参数 889 | var progressTimer; 890 | var task = { 891 | opt: opt, 892 | uploadingAjax: [], 893 | uploadingCount: 0, 894 | currentIndex: 0, 895 | chunkCount: Math.ceil(file.size / opt.slice_size), 896 | chunks: [], 897 | loadedSize: 0, 898 | uploadError: false, 899 | onTaskProgress: function (immediately) { 900 | var progress = function () { 901 | progressTimer = 0; 902 | opt.onprogress && opt.onprogress(task.loadedSize / file.size, 1); 903 | }; 904 | if (immediately) { 905 | clearTimeout(progressTimer); 906 | progress(); 907 | } else { 908 | if (progressTimer) return; 909 | progressTimer = setTimeout(progress, 100); 910 | } 911 | } 912 | }; 913 | 914 | // 整理所有分片数据 915 | (function (){ 916 | var i, partMap = {}; 917 | if (opt.listparts) { 918 | for (i = 0; i < opt.listparts.length; i++) { 919 | partMap[opt.listparts[i].offset] = opt.listparts[i]; 920 | } 921 | } 922 | for (i = 0; i < task.chunkCount; i++) { 923 | var start = i * opt.slice_size; 924 | var end = Math.min(start + opt.slice_size, file.size); 925 | var chunk = { 926 | start: start, 927 | end: end, 928 | size: end - start 929 | }; 930 | if (partMap[start]) { 931 | task.loadedSize += chunk.size; 932 | chunk.state = 'online'; 933 | } else { 934 | chunk.state = 'waiting'; 935 | } 936 | task.chunks.push(chunk); 937 | } 938 | })(); 939 | 940 | // 所有分片上传完成,发起回调 941 | var uploadSuccess = function () { 942 | task.onTaskProgress(true); 943 | defer.resolve(); 944 | }; 945 | 946 | // 出错的时候,结束所有上传,发起回调 947 | var uploadError = function (error, res) { 948 | task.uploadError = 'error'; 949 | for (var i = task.uploadingAjax.length - 1; i >= 0; i--) { 950 | var ajax = task.uploadingAjax[i]; 951 | ajax && ajax.abort(); 952 | } 953 | task.onTaskProgress(true); 954 | defer.reject(res); 955 | }; 956 | 957 | opt.globalTask.cancelRequests = function () { 958 | for (var i = task.uploadingAjax.length - 1; i >= 0; i--) { 959 | var ajax = task.uploadingAjax[i]; 960 | ajax && ajax.abort(); 961 | } 962 | }; 963 | 964 | // 开始上传并发上传,同一个上传实例里共用线程数限制 965 | var uploadNextChunk = function () { 966 | if (opt.globalTask.state === 'cancel') return; 967 | for (; that._uploadingThreadCount < that.uploadMaxThread && task.currentIndex < task.chunkCount; task.currentIndex++) { 968 | var chunk = task.chunks[task.currentIndex]; 969 | if (chunk.state !== 'waiting') continue; 970 | (function (chunk) { 971 | chunk.state = 'uploading'; 972 | task.uploadingCount++; 973 | that._uploadingThreadCount++; 974 | uploadSingleChunk.call(that, task, chunk, function (error, data) { 975 | task.uploadingCount--; 976 | that._uploadingThreadCount--; 977 | if (error) { // 错误马上结束 978 | chunk.state = 'error'; 979 | uploadError(error, data); 980 | } else { 981 | chunk.state = 'success'; 982 | if (task.uploadingCount <= 0 && task.currentIndex >= task.chunkCount) { // 全部完成 983 | uploadSuccess(); 984 | } else { // 未完成,处理执行下一个分片 985 | uploadNextChunk(); 986 | } 987 | } 988 | }); 989 | })(chunk); 990 | } 991 | if (task.uploadingCount === 0 && task.currentIndex === task.chunks.length) { // 全部不需要上传 992 | uploadSuccess(); 993 | } 994 | }; 995 | uploadNextChunk(); 996 | 997 | return defer.promise(); 998 | } 999 | 1000 | //分片上传LIST接口 1001 | function sliceList(opt) { 1002 | var that = this; 1003 | var defer = $.Deferred(); 1004 | 1005 | var file = opt.file; 1006 | 1007 | that.getAppSign(function (sign) { 1008 | 1009 | opt.sign = sign; 1010 | var url = that.getCgiUrl(opt.path, opt.sign); 1011 | 1012 | var formData = new FormData(); 1013 | formData.append('op', 'upload_slice_list'); 1014 | 1015 | $.ajax({ 1016 | type: 'POST', 1017 | dataType: "JSON", 1018 | url: url, 1019 | data: formData, 1020 | success: function (res) { 1021 | res = res || {}; 1022 | if (res.code == 0) { 1023 | opt.session = res.data.session; 1024 | opt.slice_size = res.data.slice_size; 1025 | var listparts = res.data.listparts || []; 1026 | opt.listparts = listparts; 1027 | var len = listparts.length; 1028 | if (len) { 1029 | var lastPart = opt.listparts[len - 1]; 1030 | var last_offset = lastPart.offset; 1031 | if (last_offset + lastPart.datalen > file.size) { 1032 | defer.resolve(); 1033 | return defer.promise(); 1034 | } 1035 | opt.offset = last_offset; 1036 | } 1037 | 1038 | defer.resolve(res); 1039 | } else { 1040 | defer.reject(res); 1041 | } 1042 | 1043 | }, 1044 | error: function () { 1045 | defer.reject(); 1046 | }, 1047 | processData: false, 1048 | contentType: false 1049 | }); 1050 | 1051 | 1052 | }); 1053 | 1054 | 1055 | return defer.promise(); 1056 | } 1057 | 1058 | //结束分片上传 1059 | function sliceFinish(opt) { 1060 | var that = this; 1061 | var defer = $.Deferred(); 1062 | var file = opt.file; 1063 | 1064 | that.getAppSign(function (sign) { 1065 | 1066 | opt.sign = sign; 1067 | var session = opt.session; 1068 | 1069 | var url = that.getCgiUrl(opt.path, opt.sign); 1070 | 1071 | var formData = new FormData(); 1072 | if (opt.sha) { 1073 | formData.append('sha', opt.sha); 1074 | } 1075 | formData.append('op', 'upload_slice_finish'); 1076 | formData.append('filesize', file.size); 1077 | formData.append('session', session); 1078 | 1079 | $.ajax({ 1080 | type: 'POST', 1081 | dataType: "JSON", 1082 | url: url, 1083 | data: formData, 1084 | success: function (res) { 1085 | res = res || {}; 1086 | if (res.code == 0) { 1087 | defer.resolve(res); 1088 | } else { 1089 | defer.reject(res); 1090 | } 1091 | 1092 | }, 1093 | error: function () { 1094 | defer.reject(); 1095 | }, 1096 | processData: false, 1097 | contentType: false 1098 | }); 1099 | 1100 | }); 1101 | 1102 | 1103 | return defer.promise(); 1104 | } 1105 | 1106 | function readAsBinStr(fileData) { 1107 | var readFun; 1108 | if (FileReader.prototype.readAsBinaryString) { 1109 | readFun = FileReader.prototype.readAsBinaryString; 1110 | } else if (FileReader.prototype.readAsArrayBuffer) { // 在 ie11 添加 readAsBinaryString 兼容 1111 | readFun = function (fileData) { 1112 | var binary = ""; 1113 | var pt = this; 1114 | var reader = new FileReader(); 1115 | reader.onload = function (e) { 1116 | var bytes = new Uint8Array(reader.result); 1117 | var length = bytes.byteLength; 1118 | for (var i = 0; i < length; i++) { 1119 | binary += String.fromCharCode(bytes[i]); 1120 | } 1121 | //pt.result - readonly so assign binary 1122 | pt.content = binary; 1123 | pt.onload(); 1124 | }; 1125 | reader.readAsArrayBuffer(fileData); 1126 | }; 1127 | } else { 1128 | console.error('FileReader not support readAsBinaryString'); 1129 | } 1130 | readFun.call(this, fileData); 1131 | } 1132 | 1133 | return CosCloud; 1134 | 1135 | })); 1136 | --------------------------------------------------------------------------------