demo.js 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034
  1. var config = {
  2. Bucket: 'test-1250000000',
  3. Region: 'ap-guangzhou'
  4. };
  5. var util = {
  6. createFile: function (options) {
  7. var buffer = new ArrayBuffer(options.size || 0);
  8. var arr = new Uint8Array(buffer);
  9. [].forEach.call(arr, function (char, i) {
  10. arr[i] = 0;
  11. });
  12. var opt = {};
  13. options.type && (opt.type = options.type);
  14. var blob = new Blob([buffer], options);
  15. return blob;
  16. }
  17. };
  18. // 对更多字符编码的 url encode 格式
  19. var camSafeUrlEncode = function (str) {
  20. return encodeURIComponent(str)
  21. .replace(/!/g, '%21')
  22. .replace(/'/g, '%27')
  23. .replace(/\(/g, '%28')
  24. .replace(/\)/g, '%29')
  25. .replace(/\*/g, '%2A');
  26. };
  27. var getAuthorization = function (options, callback) {
  28. // 格式一、(推荐)后端通过获取临时密钥给到前端,前端计算签名
  29. // 服务端 JS 和 PHP 例子:https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/
  30. // 服务端其他语言参考 COS STS SDK :https://github.com/tencentyun/qcloud-cos-sts-sdk
  31. // var url = '../server/sts.php'; // 如果起的是 php server 用这个
  32. var url = '/sts'; // 如果是 npm run sts.js 起的 nodejs server,使用这个
  33. var xhr = new XMLHttpRequest();
  34. xhr.open('GET', url, true);
  35. xhr.onload = function (e) {
  36. try {
  37. var data = JSON.parse(e.target.responseText);
  38. var credentials = data.credentials;
  39. } catch (e) {
  40. }
  41. if (!data || !credentials) return console.error('credentials invalid');
  42. callback({
  43. TmpSecretId: credentials.tmpSecretId,
  44. TmpSecretKey: credentials.tmpSecretKey,
  45. XCosSecurityToken: credentials.sessionToken,
  46. StartTime: data.startTime, // 时间戳,单位秒,如:1580000000,建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
  47. ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
  48. });
  49. };
  50. xhr.send();
  51. // // 格式二、(推荐)【细粒度控制权限】后端通过获取临时密钥给到前端,前端只有相同请求才重复使用临时密钥,后端可以通过 Scope 细粒度控制权限
  52. // // 服务端例子:https://github.com/tencentyun/qcloud-cos-sts-sdk/edit/master/scope.md
  53. // // var url = '../server/sts.php'; // 如果起的是 php server 用这个
  54. // var url = '/sts-scope'; // 如果是 npm run sts.js 起的 nodejs server,使用这个
  55. // var xhr = new XMLHttpRequest();
  56. // xhr.open('POST', url, true);
  57. // xhr.setRequestHeader('Content-Type', 'application/json');
  58. // xhr.onload = function (e) {
  59. // try {
  60. // var data = JSON.parse(e.target.responseText);
  61. // var credentials = data.credentials;
  62. // } catch (e) {
  63. // }
  64. // if (!data || !credentials) return console.error('credentials invalid');
  65. // callback({
  66. // TmpSecretId: credentials.tmpSecretId,
  67. // TmpSecretKey: credentials.tmpSecretKey,
  68. // XCosSecurityToken: credentials.sessionToken,
  69. // StartTime: data.startTime, // 时间戳,单位秒,如:1580000000,建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
  70. // ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000000
  71. // ScopeLimit: true, // 细粒度控制权限需要设为 true,会限制密钥只在相同请求时重复使用
  72. // });
  73. // };
  74. // xhr.send(JSON.stringify(options.Scope));
  75. // // 格式三、(不推荐,分片上传权限不好控制)前端每次请求前都需要通过 getAuthorization 获取签名,后端使用固定密钥或临时密钥计算签名返回给前端
  76. // // 服务端获取签名,请参考对应语言的 COS SDK:https://cloud.tencent.com/document/product/436/6474
  77. // // 注意:这种有安全风险,后端需要通过 method、pathname 严格控制好权限,比如不允许 put / 等
  78. // var method = (options.Method || 'get').toLowerCase();
  79. // var query = options.Query || {};
  80. // var headers = options.Headers || {};
  81. // var pathname = options.Pathname || '/';
  82. // // var url = 'http://127.0.0.1:3000/auth';
  83. // var url = '../server/auth.php';
  84. // var xhr = new XMLHttpRequest();
  85. // var data = {
  86. // method: method,
  87. // pathname: pathname,
  88. // query: query,
  89. // headers: headers,
  90. // };
  91. // xhr.open('POST', url, true);
  92. // xhr.setRequestHeader('content-type', 'application/json');
  93. // xhr.onload = function (e) {
  94. // try {
  95. // var data = JSON.parse(e.target.responseText);
  96. // } catch (e) {
  97. // }
  98. // if (!data || !data.authorization) return console.error('authorization invalid');
  99. // callback({
  100. // Authorization: data.authorization,
  101. // // XCosSecurityToken: data.sessionToken, // 如果使用临时密钥,需要把 sessionToken 传给 XCosSecurityToken
  102. // });
  103. // };
  104. // xhr.send(JSON.stringify(data));
  105. // // 格式四、(不推荐,适用于前端调试,避免泄露密钥)前端使用固定密钥计算签名
  106. // var authorization = COS.getAuthorization({
  107. // SecretId: 'AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // 可传固定密钥或者临时密钥
  108. // SecretKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // 可传固定密钥或者临时密钥
  109. // Method: options.Method,
  110. // Pathname: options.Pathname,
  111. // Query: options.Query,
  112. // Headers: options.Headers,
  113. // Expires: 900,
  114. // });
  115. // callback({
  116. // Authorization: authorization,
  117. // // XCosSecurityToken: credentials.sessionToken, // 如果使用临时密钥,需要传 XCosSecurityToken
  118. // });
  119. };
  120. var cos = new COS({
  121. getAuthorization: getAuthorization,
  122. });
  123. var TaskId;
  124. var pre = document.querySelector('.result');
  125. var showLogText = function (text, color) {
  126. if (typeof text === 'object') {
  127. try {
  128. text = JSON.stringify(text);
  129. } catch (e) {
  130. }
  131. }
  132. var div = document.createElement('div');
  133. div.innerText = text;
  134. color && (div.style.color = color);
  135. pre.appendChild(div);
  136. pre.style.display = 'block';
  137. pre.scrollTop = pre.scrollHeight;
  138. };
  139. var logger = {
  140. log: function (text) {
  141. console.log.apply(console, arguments);
  142. var args = [].map.call(arguments, function (v) {
  143. return typeof v === 'object' ? JSON.stringify(v) : v;
  144. });
  145. var logStr = args.join(' ');
  146. if(logStr.length > 1000000) {
  147. logStr = logStr.slice(0, 1000000) + '...content is too long, the first 1000000 characters are intercepted';
  148. }
  149. showLogText(logStr);
  150. },
  151. error: function (text) {
  152. console.error(text);
  153. showLogText(text, 'red');
  154. },
  155. };
  156. function getObjectUrl() {
  157. var url = cos.getObjectUrl({
  158. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  159. Region: config.Region,
  160. Key: '1mb.zip',
  161. Expires: 60,
  162. Sign: true,
  163. }, function (err, data) {
  164. logger.log(err || data && data.Url);
  165. });
  166. logger.log(url);
  167. }
  168. function getAuth() {
  169. var key = '1.png';
  170. // 这里不推荐自己拼接,推荐使用 getObjectUrl 获取 url
  171. getAuthorization({
  172. Method: 'get',
  173. Key: key
  174. }, function (AuthData) {
  175. if (typeof AuthData === 'string') {
  176. AuthData = {Authorization: AuthData.Authorization};
  177. }
  178. var url = 'http://' + config.Bucket + '.cos.' + config.Region + '.myqcloud.com' + '/' +
  179. camSafeUrlEncode(key).replace(/%2F/g, '/') +
  180. '?' + AuthData +
  181. (AuthData.XCosSecurityToken ? '&' + AuthData.XCosSecurityToken : '');
  182. logger.log(url);
  183. });
  184. }
  185. // getService、putBucket 接口会跨域,不支持浏览器使用,只在场景下可调用,比如改了 ServiceDomain 到代理地址
  186. function getService() {
  187. cos.getService({
  188. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  189. Region: config.Region,
  190. }, function (err, data) {
  191. logger.log(err || data);
  192. });
  193. }
  194. // getService、putBucket 接口会跨域,不支持浏览器使用,只在场景下可调用,比如改了 ServiceDomain 到代理地址
  195. function putBucket() {
  196. cos.putBucket({
  197. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  198. Region: config.Region,
  199. // Prefix: 'dir/'
  200. // Delimiter: '/'
  201. }, function (err, data) {
  202. logger.log(err || data);
  203. });
  204. }
  205. function getBucket() {
  206. cos.getBucket({
  207. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  208. Region: config.Region,
  209. // Prefix: 'dir/'
  210. // Delimiter: '/'
  211. }, function (err, data) {
  212. logger.log(err || data);
  213. });
  214. }
  215. function headBucket() {
  216. cos.headBucket({
  217. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  218. Region: config.Region
  219. }, function (err, data) {
  220. logger.log(err || data);
  221. });
  222. }
  223. function deleteBucket() {
  224. cos.deleteBucket({
  225. Bucket: 'testnew-' + config.Bucket.substr(config.Bucket.lastIndexOf('-') + 1),
  226. Region: 'ap-guangzhou'
  227. }, function (err, data) {
  228. console.log(err || data);
  229. });
  230. }
  231. function putBucketAcl() {
  232. cos.putBucketAcl({
  233. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  234. Region: config.Region,
  235. // GrantFullControl: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  236. // GrantWrite: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  237. // GrantRead: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  238. // GrantReadAcp: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  239. // GrantWriteAcp: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  240. // ACL: 'public-read-write',
  241. // ACL: 'public-read',
  242. ACL: 'private',
  243. // AccessControlPolicy: {
  244. // "Owner": { // AccessControlPolicy 里必须有 owner
  245. // "ID": 'qcs::cam::uin/10001:uin/10001' // 10001 是 Bucket 所属用户的 QQ 号
  246. // },
  247. // "Grants": [{
  248. // "Grantee": {
  249. // "ID": "qcs::cam::uin/1001:uin/1001", // 10002 是 QQ 号
  250. // "DisplayName": "qcs::cam::uin/1001:uin/1001" // 10002 是 QQ 号
  251. // },
  252. // "Permission": "READ"
  253. // }, {
  254. // "Grantee": {
  255. // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 QQ 号
  256. // },
  257. // "Permission": "WRITE"
  258. // }, {
  259. // "Grantee": {
  260. // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 QQ 号
  261. // },
  262. // "Permission": "READ_ACP"
  263. // }, {
  264. // "Grantee": {
  265. // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 QQ 号
  266. // },
  267. // "Permission": "WRITE_ACP"
  268. // }]
  269. // }
  270. }, function (err, data) {
  271. logger.log(err || data);
  272. });
  273. }
  274. function getBucketAcl() {
  275. cos.getBucketAcl({
  276. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  277. Region: config.Region
  278. }, function (err, data) {
  279. logger.log(err || data);
  280. });
  281. }
  282. function putBucketCors() {
  283. cos.putBucketCors({
  284. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  285. Region: config.Region,
  286. CORSRules: [{
  287. "AllowedOrigin": ["*"],
  288. "AllowedMethod": ["GET", "POST", "PUT", "DELETE", "HEAD"],
  289. "AllowedHeader": ["*"],
  290. "ExposeHeader": ["ETag", "Date", "Content-Length", "x-cos-acl", "x-cos-version-id", "x-cos-request-id", "x-cos-delete-marker", "x-cos-server-side-encryption"],
  291. "MaxAgeSeconds": "5"
  292. }]
  293. }, function (err, data) {
  294. logger.log(err || data);
  295. });
  296. }
  297. function getBucketCors() {
  298. cos.getBucketCors({
  299. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  300. Region: config.Region
  301. }, function (err, data) {
  302. logger.log(err || data);
  303. });
  304. }
  305. function deleteBucketCors() {
  306. cos.deleteBucketCors({
  307. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  308. Region: config.Region
  309. }, function (err, data) {
  310. logger.log(err || data);
  311. });
  312. }
  313. function putBucketTagging() {
  314. cos.putBucketTagging({
  315. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  316. Region: config.Region,
  317. Tagging: {
  318. "Tags": [
  319. {"Key": "k1", "Value": "v1"},
  320. {"Key": "k2", "Value": "v2"}
  321. ]
  322. }
  323. }, function (err, data) {
  324. logger.log(err || data);
  325. });
  326. }
  327. function getBucketTagging() {
  328. cos.getBucketTagging({
  329. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  330. Region: config.Region
  331. }, function (err, data) {
  332. logger.log(err || data);
  333. });
  334. }
  335. function deleteBucketTagging() {
  336. cos.deleteBucketTagging({
  337. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  338. Region: config.Region
  339. }, function (err, data) {
  340. logger.log(err || data);
  341. });
  342. }
  343. function putBucketPolicy() {
  344. var AppId = config.Bucket.substr(config.Bucket.lastIndexOf('-') + 1);
  345. cos.putBucketPolicy({
  346. Policy: {
  347. "version": "2.0",
  348. "statement": [{
  349. "effect": "allow",
  350. "principal": {"qcs": ["qcs::cam::uin/10001:uin/10001"]}, // 这里的 10001 是 QQ 号
  351. "action": [
  352. // 这里可以从临时密钥的权限上控制前端允许的操作
  353. // 'name/cos:*', // 这样写可以包含下面所有权限
  354. // // 列出所有允许的操作
  355. // // ACL 读写
  356. // 'name/cos:GetBucketACL',
  357. // 'name/cos:PutBucketACL',
  358. // 'name/cos:GetObjectACL',
  359. // 'name/cos:PutObjectACL',
  360. // // 简单 Bucket 操作
  361. // 'name/cos:PutBucket',
  362. // 'name/cos:HeadBucket',
  363. // 'name/cos:GetBucket',
  364. // 'name/cos:DeleteBucket',
  365. // 'name/cos:GetBucketLocation',
  366. // // Versioning
  367. // 'name/cos:PutBucketVersioning',
  368. // 'name/cos:GetBucketVersioning',
  369. // // CORS
  370. // 'name/cos:PutBucketCORS',
  371. // 'name/cos:GetBucketCORS',
  372. // 'name/cos:DeleteBucketCORS',
  373. // // Lifecycle
  374. // 'name/cos:PutBucketLifecycle',
  375. // 'name/cos:GetBucketLifecycle',
  376. // 'name/cos:DeleteBucketLifecycle',
  377. // // Replication
  378. // 'name/cos:PutBucketReplication',
  379. // 'name/cos:GetBucketReplication',
  380. // 'name/cos:DeleteBucketReplication',
  381. // // 删除文件
  382. // 'name/cos:DeleteMultipleObject',
  383. // 'name/cos:DeleteObject',
  384. // 简单文件操作
  385. 'name/cos:PutObject',
  386. 'name/cos:AppendObject',
  387. 'name/cos:GetObject',
  388. 'name/cos:HeadObject',
  389. 'name/cos:OptionsObject',
  390. 'name/cos:PutObjectCopy',
  391. 'name/cos:PostObjectRestore',
  392. // 分片上传操作
  393. 'name/cos:InitiateMultipartUpload',
  394. 'name/cos:ListMultipartUploads',
  395. 'name/cos:ListParts',
  396. 'name/cos:UploadPart',
  397. 'name/cos:CompleteMultipartUpload',
  398. 'name/cos:AbortMultipartUpload',
  399. ],
  400. // "resource": ["qcs::cos:ap-guangzhou:uid/1250000000:test-1250000000/*"] // 1250000000 是 appid
  401. "resource": ["qcs::cos:" + config.Region + ":uid/" + AppId + ":" + config.Bucket + "/*"] // 1250000000 是 appid
  402. }]
  403. },
  404. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  405. Region: config.Region
  406. }, function (err, data) {
  407. logger.log(err || data);
  408. });
  409. }
  410. function getBucketPolicy() {
  411. cos.getBucketPolicy({
  412. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  413. Region: config.Region
  414. }, function (err, data) {
  415. logger.log(err || data);
  416. });
  417. }
  418. function deleteBucketPolicy() {
  419. cos.deleteBucketPolicy({
  420. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  421. Region: config.Region
  422. }, function (err, data) {
  423. logger.log(err || data);
  424. });
  425. }
  426. function getBucketLocation() {
  427. cos.getBucketLocation({
  428. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  429. Region: config.Region
  430. }, function (err, data) {
  431. logger.log(err || data);
  432. });
  433. }
  434. function putBucketLifecycle() {
  435. cos.putBucketLifecycle({
  436. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  437. Region: config.Region,
  438. LifecycleConfiguration: {
  439. Rules: [{
  440. "ID": "1",
  441. "Status": "Enabled",
  442. "Filter": {},
  443. "Transition": {
  444. "Days": "30",
  445. "StorageClass": "STANDARD_IA"
  446. }
  447. }, {
  448. "ID": "2",
  449. "Status": "Enabled",
  450. "Filter": {
  451. "Prefix": "dir/"
  452. },
  453. "Transition": {
  454. "Days": "90",
  455. "StorageClass": "ARCHIVE"
  456. }
  457. }, {
  458. "ID": "3",
  459. "Status": "Enabled",
  460. "Filter": {},
  461. "Expiration": {
  462. "Days": "180"
  463. }
  464. }, {
  465. "ID": "4",
  466. "Status": "Enabled",
  467. "Filter": {},
  468. "AbortIncompleteMultipartUpload": {
  469. "DaysAfterInitiation": "30"
  470. }
  471. }],
  472. }
  473. }, function (err, data) {
  474. logger.log(err || data);
  475. });
  476. }
  477. function getBucketLifecycle() {
  478. cos.getBucketLifecycle({
  479. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  480. Region: config.Region
  481. }, function (err, data) {
  482. logger.log(err || data);
  483. });
  484. }
  485. function deleteBucketLifecycle() {
  486. cos.deleteBucketLifecycle({
  487. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  488. Region: config.Region
  489. }, function (err, data) {
  490. logger.log(err || data);
  491. });
  492. }
  493. function putBucketVersioning() {
  494. cos.putBucketVersioning({
  495. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  496. Region: config.Region,
  497. VersioningConfiguration: {
  498. Status: "Enabled"
  499. }
  500. }, function (err, data) {
  501. logger.log(err || data);
  502. });
  503. }
  504. function getBucketVersioning() {
  505. cos.getBucketVersioning({
  506. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  507. Region: config.Region
  508. }, function (err, data) {
  509. logger.log(err || data);
  510. });
  511. }
  512. function listObjectVersions() {
  513. cos.listObjectVersions({
  514. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  515. Region: config.Region,
  516. // Prefix: "",
  517. // Delimiter: '/'
  518. }, function (err, data) {
  519. logger.log(err || JSON.stringify(data, null, ' '));
  520. });
  521. }
  522. function putBucketReplication() {
  523. var AppId = config.Bucket.substr(config.Bucket.lastIndexOf('-') + 1);
  524. cos.putBucketReplication({
  525. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  526. Region: config.Region,
  527. ReplicationConfiguration: {
  528. Role: "qcs::cam::uin/10001:uin/10001",
  529. Rules: [{
  530. ID: "1",
  531. Status: "Enabled",
  532. Prefix: "sync/",
  533. Destination: {
  534. Bucket: "qcs:id/0:cos:ap-chengdu:appid/" + AppId + ":backup",
  535. // StorageClass: "Standard",
  536. }
  537. }]
  538. }
  539. }, function (err, data) {
  540. logger.log(err || data);
  541. });
  542. }
  543. function getBucketReplication() {
  544. cos.getBucketReplication({
  545. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  546. Region: config.Region
  547. }, function (err, data) {
  548. logger.log(err || data);
  549. });
  550. }
  551. function deleteBucketReplication() {
  552. cos.deleteBucketReplication({
  553. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  554. Region: config.Region
  555. }, function (err, data) {
  556. logger.log(err || data);
  557. });
  558. }
  559. function putBucketWebsite() {
  560. cos.putBucketWebsite({
  561. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  562. Region: config.Region,
  563. WebsiteConfiguration: {
  564. IndexDocument: {
  565. Suffix: "index.html" // 必选
  566. },
  567. RedirectAllRequestsTo: {
  568. Protocol: "https"
  569. },
  570. // ErrorDocument: {
  571. // Key: "error.html"
  572. // },
  573. // RoutingRules: [{
  574. // Condition: {
  575. // HttpErrorCodeReturnedEquals: "404"
  576. // },
  577. // Redirect: {
  578. // Protocol: "https",
  579. // ReplaceKeyWith: "404.html"
  580. // }
  581. // }, {
  582. // Condition: {
  583. // KeyPrefixEquals: "docs/"
  584. // },
  585. // Redirect: {
  586. // Protocol: "https",
  587. // ReplaceKeyPrefixWith: "documents/"
  588. // }
  589. // }, {
  590. // Condition: {
  591. // KeyPrefixEquals: "img/"
  592. // },
  593. // Redirect: {
  594. // Protocol: "https",
  595. // ReplaceKeyWith: "picture.jpg"
  596. // }
  597. // }]
  598. }
  599. }, function (err, data) {
  600. logger.log(err || data);
  601. });
  602. }
  603. function getBucketWebsite() {
  604. cos.getBucketWebsite({
  605. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  606. Region: config.Region
  607. },function(err, data){
  608. logger.log(err || data);
  609. });
  610. }
  611. function deleteBucketWebsite() {
  612. cos.deleteBucketWebsite({
  613. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  614. Region: config.Region
  615. },function(err, data){
  616. logger.log(err || data);
  617. });
  618. }
  619. function putObject() {
  620. // 创建测试文件
  621. var filename = '1mb.zip';
  622. var blob = util.createFile({size: 1024 * 1024 * 1});
  623. // 调用方法
  624. cos.putObject({
  625. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  626. Region: config.Region,
  627. Key: filename, /* 必须 */
  628. Body: blob,
  629. onTaskReady: function (tid) {
  630. TaskId = tid;
  631. console.log('onTaskReady', tid);
  632. },
  633. onTaskStart: function (info) {
  634. console.log('onTaskStart', info);
  635. },
  636. onProgress: function (progressData) {
  637. logger.log(JSON.stringify(progressData));
  638. },
  639. }, function (err, data) {
  640. logger.log(err || data);
  641. });
  642. }
  643. function putObjectCopy() {
  644. cos.putObjectCopy({
  645. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  646. Region: config.Region,
  647. Key: '1mb.copy.zip',
  648. CopySource: config.Bucket + '.cos.' + config.Region + '.myqcloud.com/' + camSafeUrlEncode('1mb.zip').replace(/%2F/g, '/'), // Bucket 格式:test-1250000000
  649. }, function (err, data) {
  650. logger.log(err || data);
  651. });
  652. }
  653. function getObject() {
  654. cos.getObject({
  655. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  656. Region: config.Region,
  657. Key: '1mb.zip',
  658. }, function (err, data) {
  659. logger.log(err || data);
  660. });
  661. }
  662. function headObject() {
  663. cos.headObject({
  664. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  665. Region: config.Region,
  666. Key: '1mb.zip'
  667. }, function (err, data) {
  668. logger.log(err || data);
  669. });
  670. }
  671. function putObjectAcl() {
  672. cos.putObjectAcl({
  673. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  674. Region: config.Region,
  675. Key: '1mb.zip',
  676. // GrantFullControl: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  677. // GrantWrite: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  678. // GrantRead: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  679. // ACL: 'public-read-write',
  680. // ACL: 'public-read',
  681. // ACL: 'private',
  682. ACL: 'default', // 继承上一级目录权限
  683. // AccessControlPolicy: {
  684. // "Owner": { // AccessControlPolicy 里必须有 owner
  685. // "ID": 'qcs::cam::uin/10001:uin/10001' // 10001 是 Bucket 所属用户的 QQ 号
  686. // },
  687. // "Grants": [{
  688. // "Grantee": {
  689. // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 QQ 号
  690. // },
  691. // "Permission": "READ"
  692. // }]
  693. // }
  694. }, function (err, data) {
  695. logger.log(err || data);
  696. });
  697. }
  698. function getObjectAcl() {
  699. cos.getObjectAcl({
  700. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  701. Region: config.Region,
  702. Key: '1mb.zip'
  703. }, function (err, data) {
  704. logger.log(err || data);
  705. });
  706. }
  707. function deleteObject() {
  708. cos.deleteObject({
  709. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  710. Region: config.Region,
  711. Key: '1mb.zip'
  712. }, function (err, data) {
  713. logger.log(err || data);
  714. });
  715. }
  716. function deleteMultipleObject() {
  717. cos.deleteMultipleObject({
  718. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  719. Region: config.Region,
  720. Objects: [
  721. {Key: '中文/中文.txt'},
  722. {Key: '中文/中文.zip',VersionId: 'MTg0NDY3NDI1MzM4NzM0ODA2MTI'},
  723. ]
  724. }, function (err, data) {
  725. logger.log(err || data);
  726. });
  727. }
  728. function restoreObject() {
  729. cos.restoreObject({
  730. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  731. Region: config.Region,
  732. Key: '1.txt',
  733. RestoreRequest: {
  734. Days: 1,
  735. CASJobParameters: {
  736. Tier: 'Expedited'
  737. }
  738. }
  739. }, function (err, data) {
  740. logger.log(err || data);
  741. });
  742. }
  743. function abortUploadTask() {
  744. cos.abortUploadTask({
  745. Bucket: config.Bucket, /* 必须 */ // Bucket 格式:test-1250000000
  746. Region: config.Region, /* 必须 */
  747. // 格式1,删除单个上传任务
  748. // Level: 'task',
  749. // Key: '10mb.zip',
  750. // UploadId: '14985543913e4e2642e31db217b9a1a3d9b3cd6cf62abfda23372c8d36ffa38585492681e3',
  751. // 格式2,删除单个文件所有未完成上传任务
  752. Level: 'file',
  753. Key: '10mb.zip',
  754. // 格式3,删除 Bucket 下所有未完成上传任务
  755. // Level: 'bucket',
  756. }, function (err, data) {
  757. logger.log(err || data);
  758. });
  759. }
  760. function sliceUploadFile() {
  761. var blob = util.createFile({size: 1024 * 1024 * 3});
  762. cos.sliceUploadFile({
  763. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  764. Region: config.Region,
  765. Key: '3mb.zip', /* 必须 */
  766. Body: blob,
  767. onTaskReady: function (tid) {
  768. TaskId = tid;
  769. },
  770. onHashProgress: function (progressData) {
  771. logger.log('onHashProgress', JSON.stringify(progressData));
  772. },
  773. onProgress: function (progressData) {
  774. logger.log('onProgress', JSON.stringify(progressData));
  775. },
  776. }, function (err, data) {
  777. logger.log(err || data);
  778. });
  779. }
  780. function selectFileToUpload() {
  781. var input = document.getElementById('file_selector') || document.createElement('input');
  782. input.type = 'file';
  783. input.onchange = function (e) {
  784. document.body.removeChild(input);
  785. var file = this.files[0];
  786. if (!file) return;
  787. if (file.size > 1024 * 1024) {
  788. cos.sliceUploadFile({
  789. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  790. Region: config.Region,
  791. Key: file.name,
  792. Body: file,
  793. onTaskReady: function (tid) {
  794. TaskId = tid;
  795. },
  796. onHashProgress: function (progressData) {
  797. logger.log('onHashProgress', JSON.stringify(progressData));
  798. },
  799. onProgress: function (progressData) {
  800. logger.log('onProgress', JSON.stringify(progressData));
  801. },
  802. }, function (err, data) {
  803. logger.log(err || data);
  804. });
  805. } else {
  806. cos.putObject({
  807. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  808. Region: config.Region,
  809. Key: file.name,
  810. Body: file,
  811. onTaskReady: function (tid) {
  812. TaskId = tid;
  813. },
  814. onHashProgress: function (progressData) {
  815. logger.log('onHashProgress', JSON.stringify(progressData));
  816. },
  817. onProgress: function (progressData) {
  818. logger.log(JSON.stringify(progressData));
  819. },
  820. }, function (err, data) {
  821. logger.log(err || data);
  822. });
  823. }
  824. };
  825. input.style = 'width:0;height:0;border:0;margin:0;padding:0;';
  826. input.id = 'file_selector';
  827. document.body.appendChild(input);
  828. input.click();
  829. }
  830. function cancelTask() {
  831. cos.cancelTask(TaskId);
  832. logger.log('canceled');
  833. }
  834. function pauseTask() {
  835. cos.pauseTask(TaskId);
  836. logger.log('paused');
  837. }
  838. function restartTask() {
  839. cos.restartTask(TaskId);
  840. logger.log('restart');
  841. }
  842. function uploadFiles() {
  843. var filename = 'mb.zip';
  844. var blob = util.createFile({size: 1024 * 1024 * 10});
  845. cos.uploadFiles({
  846. files: [{
  847. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  848. Region: config.Region,
  849. Key: '1' + filename,
  850. Body: blob,
  851. }, {
  852. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  853. Region: config.Region,
  854. Key: '2' + filename,
  855. Body: blob,
  856. }, {
  857. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  858. Region: config.Region,
  859. Key: '3' + filename,
  860. Body: blob,
  861. }],
  862. SliceSize: 1024 * 1024,
  863. onProgress: function (info) {
  864. var percent = parseInt(info.percent * 10000) / 100;
  865. var speed = parseInt(info.speed / 1024 / 1024 * 100) / 100;
  866. logger.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
  867. },
  868. onFileFinish: function (err, data, options) {
  869. logger.log(options.Key + ' 上传' + (err ? '失败' : '完成'));
  870. },
  871. }, function (err, data) {
  872. logger.log(err || data);
  873. });
  874. }
  875. function sliceCopyFile() {
  876. // 创建测试文件
  877. var sourceName = '3mb.zip';
  878. var Key = '3mb.copy.zip';
  879. var sourcePath = config.Bucket + '.cos.' + config.Region + '.myqcloud.com/'+ camSafeUrlEncode(sourceName).replace(/%2F/g, '/');
  880. cos.sliceCopyFile({
  881. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  882. Region: config.Region,
  883. Key: Key,
  884. CopySource: sourcePath,
  885. SliceSize: 2 * 1024 * 1024, // 大于2M的文件用分片复制,小于则用单片复制
  886. onProgress:function (info) {
  887. var percent = parseInt(info.percent * 10000) / 100;
  888. var speed = parseInt(info.speed / 1024 / 1024 * 100) / 100;
  889. logger.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
  890. }
  891. },function (err,data) {
  892. if(err){
  893. logger.log(err);
  894. }else{
  895. logger.log(data);
  896. }
  897. });
  898. }
  899. (function () {
  900. var list = [
  901. //'getService', // 不支持,正常场景会跨域
  902. //'putBucket', // 不支持,正常场景会跨域
  903. 'getObjectUrl',
  904. 'getAuth',
  905. 'getBucket',
  906. 'headBucket',
  907. 'putBucketAcl',
  908. 'getBucketAcl',
  909. 'putBucketCors',
  910. 'getBucketCors',
  911. // 'deleteBucketCors', // 不建议调用,删除 CORS,浏览器不能正常调用
  912. 'putBucketTagging',
  913. 'getBucketTagging',
  914. 'deleteBucketTagging',
  915. 'putBucketPolicy',
  916. 'getBucketPolicy',
  917. 'deleteBucketPolicy',
  918. 'getBucketLocation',
  919. 'getBucketLifecycle',
  920. 'putBucketLifecycle',
  921. 'deleteBucketLifecycle',
  922. 'putBucketVersioning',
  923. 'getBucketVersioning',
  924. 'listObjectVersions',
  925. 'putBucketReplication',
  926. 'getBucketReplication',
  927. 'deleteBucketReplication',
  928. 'putBucketWebsite',
  929. 'getBucketWebsite',
  930. 'deleteBucketWebsite',
  931. 'deleteBucket',
  932. 'putObject',
  933. 'putObjectCopy',
  934. 'getObject',
  935. 'headObject',
  936. 'putObjectAcl',
  937. 'getObjectAcl',
  938. 'deleteObject',
  939. 'deleteMultipleObject',
  940. 'restoreObject',
  941. 'abortUploadTask',
  942. 'sliceUploadFile',
  943. 'selectFileToUpload',
  944. 'cancelTask',
  945. 'pauseTask',
  946. 'restartTask',
  947. 'uploadFiles',
  948. 'sliceCopyFile',
  949. ];
  950. var container = document.querySelector('.main');
  951. var html = [];
  952. list.forEach(function (name) {
  953. html.push('<a href="javascript:void(0)">' + name + '</a>');
  954. });
  955. container.innerHTML = html.join('');
  956. container.onclick = function (e) {
  957. if (e.target.tagName === 'A') {
  958. var name = e.target.innerText.trim();
  959. window[name]();
  960. }
  961. };
  962. })();