demo-sdk.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. var COS = require('./lib/cos-wx-sdk-v5');
  2. var wxfs = wx.getFileSystemManager();
  3. var config = require('./config');
  4. var { cos, requestCallback } = require('./tools');
  5. var TaskId;
  6. var mylog = function (msg) {
  7. wx.showToast({
  8. title: msg,
  9. icon: 'success',
  10. duration: 3000,
  11. });
  12. };
  13. // 对云上数据进行图片处理
  14. function request() {
  15. cos.request(
  16. {
  17. Bucket: config.Bucket,
  18. Region: config.Region,
  19. Key: 'photo.png',
  20. Method: 'POST',
  21. Action: 'image_process',
  22. Headers: {
  23. // 通过 imageMogr2 接口使用图片缩放功能:指定图片宽度为 200,宽度等比压缩
  24. 'Pic-Operations':
  25. '{"is_pic_info": 1, "rules": [{"fileid": "desample_photo.jpg", "rule": "imageMogr2/thumbnail/200x/"}]}',
  26. },
  27. },
  28. (err, data) => {
  29. console.log(err || data);
  30. }
  31. );
  32. }
  33. function uploadFile() {
  34. var uploadFile = function (file) {
  35. cos.uploadFile(
  36. {
  37. Bucket: config.Bucket,
  38. Region: config.Region,
  39. Key: file.name,
  40. FilePath: file.path,
  41. FileSize: file.size,
  42. SliceSize: 1024 * 1024 * 5, // 文件大于5mb自动使用分块上传
  43. onTaskReady: function (taskId) {
  44. TaskId = taskId;
  45. },
  46. onProgress: function (info) {
  47. var percent = parseInt(info.percent * 10000) / 100;
  48. var speed = parseInt((info.speed / 1024 / 1024) * 100) / 100;
  49. console.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
  50. },
  51. onFileFinish: function (err, data, options) {
  52. console.log(options.Key + '上传' + (err ? '失败' : '完成'));
  53. },
  54. },
  55. function (err, data) {
  56. console.log(err || data);
  57. }
  58. );
  59. };
  60. wx.chooseMessageFile({
  61. count: 10,
  62. type: 'all',
  63. success: function (res) {
  64. uploadFile(res.tempFiles[0]);
  65. },
  66. });
  67. }
  68. function uploadFiles() {
  69. var uploadFiles = function (files) {
  70. const fileList = files.map(function (file) {
  71. return Object.assign(file, {
  72. Bucket: config.Bucket,
  73. Region: config.Region,
  74. Key: file.name,
  75. FilePath: file.path,
  76. });
  77. });
  78. cos.uploadFiles(
  79. {
  80. files: fileList,
  81. SliceSize: 1024 * 1024 * 5, // 文件大于5mb自动使用分块上传
  82. onProgress: function (info) {
  83. var percent = parseInt(info.percent * 10000) / 100;
  84. var speed = parseInt((info.speed / 1024 / 1024) * 100) / 100;
  85. console.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
  86. },
  87. onFileFinish: function (err, data, options) {
  88. console.log(options.Key + '上传' + (err ? '失败' : '完成'));
  89. },
  90. },
  91. function (err, data) {
  92. console.log(err || data);
  93. }
  94. );
  95. };
  96. wx.chooseMessageFile({
  97. count: 10,
  98. type: 'all',
  99. success: function (res) {
  100. uploadFiles(res.tempFiles);
  101. },
  102. });
  103. }
  104. function sliceUploadFile() {
  105. var sliceUploadFile = function (file) {
  106. var key = file.name;
  107. cos.sliceUploadFile(
  108. {
  109. Bucket: config.Bucket,
  110. Region: config.Region,
  111. Key: key,
  112. FilePath: file.path,
  113. FileSize: file.size,
  114. CacheControl: 'max-age=7200',
  115. Headers: {
  116. aa: 123,
  117. },
  118. Query: {
  119. bb: 123,
  120. },
  121. onTaskReady: function (taskId) {
  122. TaskId = taskId;
  123. },
  124. onHashProgress: function (info) {
  125. console.log('check hash', JSON.stringify(info));
  126. },
  127. onProgress: function (info) {
  128. console.log(JSON.stringify(info));
  129. },
  130. },
  131. requestCallback
  132. );
  133. };
  134. wx.chooseMessageFile({
  135. count: 10,
  136. type: 'all',
  137. success: function (res) {
  138. sliceUploadFile(res.tempFiles[0]);
  139. },
  140. });
  141. // wx.chooseVideo({
  142. // sourceType: ['album','camera'],
  143. // maxDuration: 60,
  144. // camera: 'back',
  145. // success(res) {
  146. // var name = res.tempFilePath.replace(/^.*?([^/]{32}\.\w+)$/, '$1');
  147. // sliceUploadFile({
  148. // name: name,
  149. // path: res.tempFilePath,
  150. // size: res.size,
  151. // });
  152. // },
  153. // fail(err) {
  154. // console.log(err);
  155. // }
  156. // })
  157. }
  158. function postObject() {
  159. wx.chooseImage({
  160. count: 1, // 默认9
  161. sizeType: ['original'], // 可以指定是原图还是压缩图,默认二者都有
  162. sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
  163. success: function (res) {
  164. var file = res.tempFiles[0];
  165. cos.postObject(
  166. {
  167. Bucket: config.Bucket,
  168. Region: config.Region,
  169. Key: '1.png',
  170. FilePath: file.path,
  171. onTaskReady: function (taskId) {
  172. TaskId = taskId;
  173. },
  174. onProgress: function (info) {
  175. console.log(JSON.stringify(info));
  176. },
  177. },
  178. requestCallback
  179. );
  180. },
  181. });
  182. }
  183. function putObject() {
  184. wx.chooseMessageFile({
  185. count: 10,
  186. type: 'all',
  187. success: function (res) {
  188. var file = res.tempFiles[0];
  189. wxfs.readFile({
  190. filePath: file.path,
  191. success: function (res) {
  192. cos.putObject(
  193. {
  194. Bucket: config.Bucket,
  195. Region: config.Region,
  196. Key: file.name,
  197. Body: res.data, // 在小程序里,putObject 接口只允许传字符串的内容,不支持 TaskReady 和 onProgress,上传请使用 cos.postObject 接口
  198. Headers: {
  199. // 万象持久化接口,上传时持久化。例子:通过 imageMogr2 接口使用图片缩放功能:指定图片宽度为 200,宽度等比压缩
  200. // 'Pic-Operations': '{"is_pic_info": 1, "rules": [{"fileid": "desample_photo.jpg", "rule": "imageMogr2/thumbnail/200x/"}]}'
  201. },
  202. },
  203. requestCallback
  204. );
  205. },
  206. fail: (err) => console.error(err),
  207. });
  208. },
  209. fail: (err) => console.error(err),
  210. });
  211. }
  212. function putObjectStr() {
  213. cos.putObject(
  214. {
  215. Bucket: config.Bucket,
  216. Region: config.Region,
  217. Key: '1.txt',
  218. Body: 'hello world', // 在小程序里,putObject 接口只允许传字符串的内容,不支持 TaskReady 和 onProgress,上传请使用 cos.postObject 接口
  219. Headers: {
  220. aa: 123,
  221. },
  222. Query: {
  223. bb: 123,
  224. },
  225. },
  226. requestCallback
  227. );
  228. }
  229. function putObjectBase64() {
  230. var base64Url =
  231. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABRFBMVEUAAAAAo/8Ao/8Ao/8Ao/8ApP8Aov8Ao/8Abv8Abv8AyNwAyNwAo/8Ao/8Ao/8Abv8Ao/8AivgAo/8AyNwAbv8Abv8AydwApf8Abf8Ao/8AbP8Ao/8AyNwAydwAbv8AydwApP8Ao/8AyNwAo/8AyNwAydsAyNwAxd8Aov8AyNwAytsAo/8Abv8AyNwAbv8Av+MAo/8AytsAo/8Abv8AyNwAo/8Abv8AqfkAbv8Aov8Abv8AyNwAov8Abv8Ao/8Abv8Ao/8AydwAo/8Ao/8Ate8Ay9oAvOcAof8AveAAyNwAyNwAo/8AyNwAy9kAo/8AyNwAyNwAo/8AqP8Aaf8AyNwAbv0Abv8Abv8AaP8Ao/8Ao/8Ao/8Ao/8Abv8AyNwAgvcAaP8A0dkAo/8AyNwAav8Abv8Ao/8Abv8AyNwAy9sAvOUAtePdkYxjAAAAZnRSTlMAw/co8uAuJAn8+/Tt29R8DAX77+nZz87Jv6CTh3lxTklAPjouJRsL5tjAuLiyr62roaCakYp0XVtOQTMyLiohICAcGRP49vTv5+PJurawq6mnnJuYl4+OiIB7eXVvX15QSDgqHxNcw3l6AAABe0lEQVQ4y82P11oCQQxGIy5FUJpKk6aAhV6k92LvvXedDfj+92ZkYQHxnnMxu3/OfJMEJo6y++baXf5XVw22GVGcsRmq431mQZRYyIzRGgdXi+HwIv86NDBKisrRAtU1hSj9pkZ9jpo/9YKbRsmNNKCHDXI00BxfMMirKNpMcjQ5Lm4/YZArUXyBYUwg40nsdr5jb3LBe25VWpNeKa1GENsEnq52C80z1uW48estiKjb19G54QdCrScnKAU69U3KJ4jzrsBawDWPuOcBqMyRvlcb1Y+zjMUBVsivAKe4gXgEKiVjSh9wlunGMmwiOqFL3RI0cj+nkgp3jC1BELVFkGiZSuvkp3tZZWZ2sKCuDj185PXqfmwI7AAOUctHkJoOeXg3sxA4ES+l7CVvrYHMEmNp8GtR+wycPG0+1RrwWQUzl4CvgQmPP5Ddofl8tWkJVT7J+BIAaxEktrYZoRAUfXgOGYHfcOqw3WF/EdLccz5cMfvUCPb4QwUmhB8+v12HZPCkbgAAAABJRU5ErkJggg==';
  232. var m = /data:image\/(\w+);base64,(.*)/.exec(base64Url) || [];
  233. var format = m[1];
  234. var bodyData = m[2];
  235. var fileBuf = wx.base64ToArrayBuffer(bodyData);
  236. cos.putObject(
  237. {
  238. Bucket: config.Bucket,
  239. Region: config.Region,
  240. Key: '1.' + format,
  241. Body: fileBuf,
  242. },
  243. requestCallback
  244. );
  245. }
  246. function getObjectUrl() {
  247. var url = cos.getObjectUrl(
  248. {
  249. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  250. Region: config.Region,
  251. Key: '1mb.zip',
  252. Expires: 60,
  253. Sign: true,
  254. },
  255. function (err, data) {
  256. console.log(err || data);
  257. }
  258. );
  259. console.log(url);
  260. }
  261. var toolsDao = {
  262. request: request,
  263. 'uploadFile 高级上传': uploadFile,
  264. 'uploadFiles 批量上传': uploadFiles,
  265. 'sliceUploadFile 分片上传': sliceUploadFile,
  266. // 上传文件适用于单请求上传大文件
  267. 'postObject 简单上传': postObject,
  268. 'putObject 简单上传文件': putObject,
  269. 'putObject 上传字符串': putObjectStr,
  270. // 上传文件
  271. 'putObject base64 转 ArrayBuffer 上传': putObjectBase64,
  272. 'getObjectUrl 获取对象访问url': getObjectUrl,
  273. };
  274. var bucketDao = {
  275. // Service
  276. 'getService 获取存储桶列表': function () {
  277. cos.getService(requestCallback);
  278. },
  279. // 简单 Bucket 操作
  280. 'putBucket 创建存储桶': function () {
  281. cos.putBucket(
  282. {
  283. Bucket: config.Bucket,
  284. Region: config.Region,
  285. },
  286. requestCallback
  287. );
  288. },
  289. 'headBucket 检索存储桶及其权限': function () {
  290. cos.headBucket(
  291. {
  292. Bucket: config.Bucket,
  293. Region: config.Region,
  294. },
  295. requestCallback
  296. );
  297. },
  298. 'deleteBucket 删除存储桶': function () {
  299. cos.deleteBucket(
  300. {
  301. Bucket: config.Bucket,
  302. Region: config.Region,
  303. },
  304. requestCallback
  305. );
  306. },
  307. 'getBucketACL 查询存储桶 ACL': function () {
  308. cos.getBucketAcl(
  309. {
  310. Bucket: config.Bucket,
  311. Region: config.Region,
  312. },
  313. requestCallback
  314. );
  315. },
  316. 'putBucketACL 设置存储桶 ACL': function () {
  317. cos.putBucketAcl(
  318. {
  319. Bucket: config.Bucket,
  320. Region: config.Region,
  321. ACL: 'public-read',
  322. },
  323. requestCallback
  324. );
  325. },
  326. 'getBucketCors 查询跨域配置': function () {
  327. cos.getBucketCors(
  328. {
  329. Bucket: config.Bucket,
  330. Region: config.Region,
  331. },
  332. requestCallback
  333. );
  334. },
  335. 'putBucketCors 设置跨域配置': function () {
  336. cos.putBucketCors(
  337. {
  338. Bucket: config.Bucket,
  339. Region: config.Region,
  340. ResponseVary: 'true',
  341. CORSRules: [
  342. {
  343. AllowedOrigin: ['*'],
  344. AllowedMethod: ['GET', 'POST', 'PUT', 'DELETE', 'HEAD'],
  345. AllowedHeader: ['*'],
  346. ExposeHeader: ['ETag', 'Content-Length'],
  347. MaxAgeSeconds: '5',
  348. },
  349. ],
  350. },
  351. requestCallback
  352. );
  353. },
  354. 'deleteBucketCors 删除跨域配置': function () {
  355. cos.deleteBucketCors(
  356. {
  357. Bucket: config.Bucket,
  358. Region: config.Region,
  359. },
  360. requestCallback
  361. );
  362. },
  363. 'putBucketPolicy 设置存储桶策略': function () {
  364. var AppId = config.Bucket.substr(config.Bucket.lastIndexOf('-') + 1);
  365. cos.putBucketPolicy(
  366. {
  367. Bucket: config.Bucket,
  368. Region: config.Region,
  369. Policy: {
  370. version: '2.0',
  371. principal: {
  372. qcs: ['qcs::cam::uin/10001:uin/10001'],
  373. }, // 这里的 10001 是 QQ 号
  374. statement: [
  375. {
  376. effect: 'allow',
  377. action: [
  378. 'name/cos:GetBucket',
  379. 'name/cos:PutObject',
  380. 'name/cos:PostObject',
  381. 'name/cos:PutObjectCopy',
  382. 'name/cos:InitiateMultipartUpload',
  383. 'name/cos:UploadPart',
  384. 'name/cos:UploadPartCopy',
  385. 'name/cos:CompleteMultipartUpload',
  386. 'name/cos:AbortMultipartUpload',
  387. 'name/cos:AppendObject',
  388. ],
  389. // "resource": ["qcs::cos:ap-guangzhou:uid/1250000000:test-1250000000/*"] // 1250000000 是 appid
  390. resource: ['qcs::cos:' + config.Region + ':uid/' + AppId + ':' + config.Bucket + '/*'], // 1250000000 是 appid
  391. },
  392. ],
  393. },
  394. },
  395. requestCallback
  396. );
  397. },
  398. 'getBucketPolicy 查询存储桶策略': function () {
  399. cos.getBucketPolicy(
  400. {
  401. Bucket: config.Bucket,
  402. Region: config.Region,
  403. },
  404. requestCallback
  405. );
  406. },
  407. 'deleteBucketPolicy 删除存储桶策略': function () {
  408. cos.deleteBucketPolicy(
  409. {
  410. Bucket: config.Bucket,
  411. Region: config.Region,
  412. },
  413. requestCallback
  414. );
  415. },
  416. 'getBucketLocation 获取Bucket的地域信息': function () {
  417. cos.getBucketLocation(
  418. {
  419. Bucket: config.Bucket,
  420. Region: config.Region,
  421. },
  422. requestCallback
  423. );
  424. },
  425. 'getBucketTagging 获取Bucket标签': function () {
  426. cos.getBucketTagging(
  427. {
  428. Bucket: config.Bucket,
  429. Region: config.Region,
  430. },
  431. requestCallback
  432. );
  433. },
  434. 'putBucketTagging 设置Bucket标签': function () {
  435. cos.putBucketTagging(
  436. {
  437. Bucket: config.Bucket,
  438. Region: config.Region,
  439. Tagging: {
  440. Tags: [
  441. {
  442. Key: 'k1',
  443. Value: 'v1',
  444. },
  445. {
  446. Key: 'k2',
  447. Value: 'v2',
  448. },
  449. ],
  450. },
  451. },
  452. requestCallback
  453. );
  454. },
  455. 'deleteBucketTagging 删除存储桶标签': function () {
  456. cos.deleteBucketTagging(
  457. {
  458. Bucket: config.Bucket,
  459. Region: config.Region,
  460. },
  461. requestCallback
  462. );
  463. },
  464. };
  465. var objectDao = {
  466. 'getBucket 获取对象列表': function () {
  467. cos.getBucket(
  468. {
  469. Bucket: config.Bucket,
  470. Region: config.Region,
  471. },
  472. requestCallback
  473. );
  474. },
  475. // 上传文件适用于单请求上传大文件
  476. 'postObject 表单上传对象': postObject,
  477. 'putObject 简单上传文件': putObject,
  478. 'putObject 上传字符串': putObjectStr,
  479. // 上传文件
  480. 'putObject base64 转 ArrayBuffer 上传': putObjectBase64,
  481. 'getObject 下载对象': function () {
  482. cos.getObject(
  483. {
  484. Bucket: config.Bucket,
  485. Region: config.Region,
  486. Key: '1.png',
  487. },
  488. function (err, data) {
  489. console.log('getObject:', err || data);
  490. }
  491. );
  492. },
  493. 'abortUploadTask 抛弃分块上传任务': function () {
  494. cos.abortUploadTask(
  495. {
  496. Bucket: config.Bucket,
  497. /* 必须 */ // Bucket 格式:test-1250000000
  498. Region: config.Region,
  499. /* 必须 */
  500. // 格式1,删除单个上传任务
  501. // Level: 'task',
  502. // Key: '10mb.zip',
  503. // UploadId: '14985543913e4e2642e31db217b9a1a3d9b3cd6cf62abfda23372c8d36ffa38585492681e3',
  504. // 格式2,删除单个文件所有未完成上传任务
  505. Level: 'file',
  506. Key: '10mb.zip',
  507. // 格式3,删除 Bucket 下所有未完成上传任务
  508. // Level: 'bucket',
  509. },
  510. requestCallback
  511. );
  512. },
  513. };
  514. var advanceObjectDao = {
  515. 'sliceUploadFile 分块上传': function () {
  516. var sliceUploadFile = function (file) {
  517. var key = file.name;
  518. cos.sliceUploadFile(
  519. {
  520. Bucket: config.Bucket,
  521. Region: config.Region,
  522. Key: key,
  523. FilePath: file.path,
  524. FileSize: file.size,
  525. CacheControl: 'max-age=7200',
  526. Headers: {
  527. aa: 123,
  528. },
  529. Query: {
  530. bb: 123,
  531. },
  532. onTaskReady: function (taskId) {
  533. TaskId = taskId;
  534. },
  535. onHashProgress: function (info) {
  536. console.log('check hash', JSON.stringify(info));
  537. },
  538. onProgress: function (info) {
  539. console.log(JSON.stringify(info));
  540. },
  541. },
  542. requestCallback
  543. );
  544. };
  545. wx.chooseMessageFile({
  546. count: 10,
  547. type: 'all',
  548. success: function (res) {
  549. sliceUploadFile(res.tempFiles[0]);
  550. },
  551. });
  552. // wx.chooseVideo({
  553. // sourceType: ['album','camera'],
  554. // maxDuration: 60,
  555. // camera: 'back',
  556. // success(res) {
  557. // var name = res.tempFilePath.replace(/^.*?([^/]{32}\.\w+)$/, '$1');
  558. // sliceUploadFile({
  559. // name: name,
  560. // path: res.tempFilePath,
  561. // size: res.size,
  562. // });
  563. // },
  564. // fail(err) {
  565. // console.log(err);
  566. // }
  567. // })
  568. },
  569. 'sliceCopyFile 分块复制对象': function () {
  570. // 创建测试文件
  571. var sourceName = '1.txt';
  572. var Key = '1.slicecopy.exe';
  573. var sourcePath = config.Bucket + '.cos.' + config.Region + '.myqcloud.com/' + sourceName;
  574. cos.sliceCopyFile(
  575. {
  576. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  577. Region: config.Region,
  578. Key: Key,
  579. CopySource: sourcePath,
  580. SliceSize: 20 * 1024 * 1024, // 大于20M的文件用分片复制,小于则用单片复制
  581. onProgress: function (info) {
  582. var percent = parseInt(info.percent * 10000) / 100;
  583. var speed = parseInt((info.speed / 1024 / 1024) * 100) / 100;
  584. console.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
  585. },
  586. },
  587. requestCallback
  588. );
  589. },
  590. cancelTask: function () {
  591. cos.cancelTask(TaskId);
  592. console.log('canceled');
  593. },
  594. pauseTask: function () {
  595. cos.pauseTask(TaskId);
  596. console.log('paused');
  597. },
  598. restartTask: function () {
  599. cos.restartTask(TaskId);
  600. console.log('restart');
  601. },
  602. };
  603. // require('./test');
  604. module.exports = {
  605. toolsDao: toolsDao,
  606. bucketDao: bucketDao,
  607. objectDao: objectDao,
  608. advanceObjectDao: advanceObjectDao,
  609. };