demo-sdk.js 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. var COS = require('./lib/cos-wx-sdk-v5');
  2. var wxfs = wx.getFileSystemManager();
  3. var config = require('./config');
  4. var TaskId;
  5. // 签名回调
  6. var getAuthorization = function(options, callback) {
  7. // 格式一、(推荐)后端通过获取临时密钥给到前端,前端计算签名
  8. // 服务端 JS 和 PHP 例子:https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/
  9. // 服务端其他语言参考 COS STS SDK :https://github.com/tencentyun/qcloud-cos-sts-sdk
  10. wx.request({
  11. method: 'GET',
  12. url: config.stsUrl, // 服务端签名,参考 server 目录下的两个签名例子
  13. dataType: 'json',
  14. success: function(result) {
  15. var data = result.data;
  16. var credentials = data && data.credentials;
  17. if (!data || !credentials) return console.error('credentials invalid');
  18. callback({
  19. TmpSecretId: credentials.tmpSecretId,
  20. TmpSecretKey: credentials.tmpSecretKey,
  21. XCosSecurityToken: credentials.sessionToken,
  22. StartTime: data.startTime, // 时间戳,单位秒,如:1580000000,建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
  23. ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
  24. });
  25. }
  26. });
  27. // // 格式二、(推荐)【细粒度控制权限】后端通过获取临时密钥给到前端,前端只有相同请求才重复使用临时密钥,后端可以通过 Scope 细粒度控制权限
  28. // // 服务端例子:https://github.com/tencentyun/qcloud-cos-sts-sdk/edit/master/scope.md
  29. // wx.request({
  30. // method: 'POST',
  31. // url: 'http://127.0.0.1:3000/sts-scope',
  32. // data: options.Scope,
  33. // dataType: 'json',
  34. // success: function(result) {
  35. // var data = result.data;
  36. // var credentials = data && data.credentials;
  37. // if (!data || !credentials) return console.error('credentials invalid');
  38. // callback({
  39. // TmpSecretId: credentials.tmpSecretId,
  40. // TmpSecretKey: credentials.tmpSecretKey,
  41. // XCosSecurityToken: credentials.sessionToken,
  42. // StartTime: data.startTime, // 时间戳,单位秒,如:1580000000,建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
  43. // ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
  44. // ScopeLimit: true, // 细粒度控制权限需要设为 true,会限制密钥只在相同请求时重复使用
  45. // });
  46. // }
  47. // });
  48. // // 格式三、(不推荐,分片上传权限不好控制)前端每次请求前都需要通过 getAuthorization 获取签名,后端使用固定密钥或临时密钥计算签名返回给前端
  49. // // 服务端获取签名,请参考对应语言的 COS SDK:https://cloud.tencent.com/document/product/436/6474
  50. // // 注意:这种有安全风险,后端需要通过 method、pathname 严格控制好权限,比如不允许 put / 等
  51. // wx.request({
  52. // method: 'POST',
  53. // url: 'https://example.com/sts-auth.php, // 服务端签名,参考 server 目录下的两个签名例子
  54. // data: {
  55. // method: options.Method,
  56. // pathname: options.Pathname,
  57. // query: options.Query,
  58. // headers: options.Headers,
  59. // },
  60. // dataType: 'json',
  61. // success: function(result) {
  62. // var data = result.data;
  63. // if (!data || !data.authorization) return console.error('authorization invalid');
  64. // callback({
  65. // Authorization: data.authorization,
  66. // // XCosSecurityToken: data.sessionToken, // 如果使用临时密钥,需要传 sessionToken
  67. // });
  68. // }
  69. // });
  70. // // 格式四、(不推荐,适用于前端调试,避免泄露密钥)前端使用固定密钥计算签名
  71. // var authorization = COS.getAuthorization({
  72. // SecretId: 'AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  73. // SecretKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  74. // Method: options.Method,
  75. // Pathname: options.Pathname,
  76. // Query: options.Query,
  77. // Headers: options.Headers,
  78. // Expires: 60,
  79. // });
  80. // callback({
  81. // Authorization: authorization,
  82. // // XCosSecurityToken: credentials.sessionToken, // 如果使用临时密钥,需要传 XCosSecurityToken
  83. // });
  84. };
  85. var cos = new COS({
  86. // path style 指正式请求时,Bucket 是在 path 里,这样用相同园区多个 bucket 只需要配置一个园区域名
  87. // ForcePathStyle: true,
  88. getAuthorization: getAuthorization,
  89. // 是否使用全球加速域名。开启该配置后仅以下接口支持操作:putObject、getObject、headObject、optionsObject、multipartInit、multipartListPart、multipartUpload、multipartAbort、multipartComplete、multipartList、sliceUploadFile、uploadFiles
  90. // UseAccelerate: true,
  91. });
  92. // 回调统一处理函数
  93. var requestCallback = function(err, data) {
  94. console.log(err || data);
  95. if (err && err.error) {
  96. wx.showModal({
  97. title: '返回错误',
  98. content: '请求失败:' + (err.error.Message || err.error) + ';状态码:' + err.statusCode,
  99. showCancel: false
  100. });
  101. } else if (err) {
  102. wx.showModal({
  103. title: '请求出错',
  104. content: '请求出错:' + err + ';状态码:' + err.statusCode,
  105. showCancel: false
  106. });
  107. } else {
  108. wx.showToast({
  109. title: '请求成功',
  110. icon: 'success',
  111. duration: 3000
  112. });
  113. }
  114. };
  115. var mylog = function (msg) {
  116. wx.showToast({
  117. title: msg,
  118. icon: 'success',
  119. duration: 3000
  120. });
  121. };
  122. var toolsDao = {
  123. 'request': function(){
  124. // 对云上数据进行图片处理
  125. cos.request({
  126. Bucket: config.Bucket,
  127. Region: config.Region,
  128. Key: 'photo.png',
  129. Method: 'POST',
  130. Action: 'image_process',
  131. Headers: {
  132. // 通过 imageMogr2 接口使用图片缩放功能:指定图片宽度为 200,宽度等比压缩
  133. 'Pic-Operations': '{"is_pic_info": 1, "rules": [{"fileid": "desample_photo.jpg", "rule": "imageMogr2/thumbnail/200x/"}]}'
  134. },
  135. }, (err, data) => {
  136. console.log(err || data)
  137. });
  138. },
  139. 'uploadFile 高级上传': function() {
  140. var uploadFile = function(file) {
  141. cos.uploadFile({
  142. Bucket: config.Bucket,
  143. Region: config.Region,
  144. Key: file.name,
  145. FilePath: file.path,
  146. SliceSize: 1024 * 1024 * 5, // 文件大于5mb自动使用分块上传
  147. onProgress: function (info) {
  148. var percent = parseInt(info.percent * 10000) / 100;
  149. var speed = parseInt(info.speed / 1024 / 1024 * 100) / 100;
  150. console.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
  151. },
  152. onFileFinish: function (err, data, options) {
  153. console.log(options.Key + '上传' + (err ? '失败' : '完成'));
  154. },
  155. }, function (err, data) {
  156. console.log(err || data);
  157. });
  158. }
  159. wx.chooseMessageFile({
  160. count: 10,
  161. type: 'all',
  162. success: function(res) {
  163. uploadFile(res.tempFiles[0]);
  164. }
  165. });
  166. },
  167. 'uploadFiles 批量上传': function() {
  168. var uploadFiles = function(files) {
  169. const fileList = files.map(function(file) {
  170. return Object.assign(file, {
  171. Bucket: config.Bucket,
  172. Region: config.Region,
  173. Key: file.name,
  174. FilePath: file.path,
  175. });
  176. });
  177. cos.uploadFiles({
  178. files: fileList,
  179. SliceSize: 1024 * 1024 * 5, // 文件大于5mb自动使用分块上传
  180. onProgress: function (info) {
  181. var percent = parseInt(info.percent * 10000) / 100;
  182. var speed = parseInt(info.speed / 1024 / 1024 * 100) / 100;
  183. console.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
  184. },
  185. onFileFinish: function (err, data, options) {
  186. console.log(options.Key + '上传' + (err ? '失败' : '完成'));
  187. },
  188. }, function (err, data) {
  189. console.log(err || data);
  190. });
  191. }
  192. wx.chooseMessageFile({
  193. count: 10,
  194. type: 'all',
  195. success: function(res) {
  196. uploadFiles(res.tempFiles);
  197. }
  198. });
  199. },
  200. 'sliceUploadFile 分片上传': function() {
  201. var sliceUploadFile = function (file) {
  202. var key = file.name;
  203. cos.sliceUploadFile({
  204. Bucket: config.Bucket,
  205. Region: config.Region,
  206. Key: key,
  207. FilePath: file.path,
  208. FileSize: file.size,
  209. CacheControl: 'max-age=7200',
  210. Headers: {
  211. aa: 123,
  212. },
  213. Query: {
  214. bb: 123,
  215. },
  216. onTaskReady: function(taskId) {
  217. TaskId = taskId
  218. },
  219. onHashProgress: function(info) {
  220. console.log('check hash', JSON.stringify(info));
  221. },
  222. onProgress: function(info) {
  223. console.log(JSON.stringify(info));
  224. }
  225. }, requestCallback);
  226. };
  227. wx.chooseMessageFile({
  228. count: 10,
  229. type: 'all',
  230. success: function(res) {
  231. sliceUploadFile(res.tempFiles[0]);
  232. }
  233. });
  234. // wx.chooseVideo({
  235. // sourceType: ['album','camera'],
  236. // maxDuration: 60,
  237. // camera: 'back',
  238. // success(res) {
  239. // var name = res.tempFilePath.replace(/^.*?([^/]{32}\.\w+)$/, '$1');
  240. // sliceUploadFile({
  241. // name: name,
  242. // path: res.tempFilePath,
  243. // size: res.size,
  244. // });
  245. // },
  246. // fail(err) {
  247. // console.log(err);
  248. // }
  249. // })
  250. },
  251. // 上传文件适用于单请求上传大文件
  252. 'postObject 简单上传': function() {
  253. wx.chooseImage({
  254. count: 1, // 默认9
  255. sizeType: ['original'], // 可以指定是原图还是压缩图,默认二者都有
  256. sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
  257. success: function(res) {
  258. var file = res.tempFiles[0];
  259. cos.postObject({
  260. Bucket: config.Bucket,
  261. Region: config.Region,
  262. Key: '1.png',
  263. FilePath: file.path,
  264. onTaskReady: function(taskId) {
  265. TaskId = taskId
  266. },
  267. onProgress: function(info) {
  268. console.log(JSON.stringify(info));
  269. }
  270. }, requestCallback);
  271. }
  272. })
  273. },
  274. 'putObject 简单上传文件': function(type) {
  275. wx.chooseMessageFile({
  276. count: 10,
  277. type: 'all',
  278. success: function(res) {
  279. var file = res.tempFiles[0];
  280. wxfs.readFile({
  281. filePath: file.path,
  282. success: function (res) {
  283. cos.putObject({
  284. Bucket: config.Bucket,
  285. Region: config.Region,
  286. Key: file.name,
  287. Body: res.data, // 在小程序里,putObject 接口只允许传字符串的内容,不支持 TaskReady 和 onProgress,上传请使用 cos.postObject 接口
  288. Headers: {
  289. // 万象持久化接口,上传时持久化。例子:通过 imageMogr2 接口使用图片缩放功能:指定图片宽度为 200,宽度等比压缩
  290. // 'Pic-Operations': '{"is_pic_info": 1, "rules": [{"fileid": "desample_photo.jpg", "rule": "imageMogr2/thumbnail/200x/"}]}'
  291. },
  292. }, requestCallback);
  293. },
  294. fail: err => console.error(err),
  295. });
  296. },
  297. fail: err => console.error(err),
  298. });
  299. },
  300. 'putObject 上传字符串': function(type) {
  301. cos.putObject({
  302. Bucket: config.Bucket,
  303. Region: config.Region,
  304. Key: '1.txt',
  305. Body: 'hello world', // 在小程序里,putObject 接口只允许传字符串的内容,不支持 TaskReady 和 onProgress,上传请使用 cos.postObject 接口
  306. Headers: {
  307. aa: 123,
  308. },
  309. Query: {
  310. bb: 123,
  311. },
  312. }, requestCallback);
  313. },
  314. // 上传文件
  315. 'putObject base64 转 ArrayBuffer 上传': function() {
  316. var base64Url = '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==';
  317. var m = (/data:image\/(\w+);base64,(.*)/.exec(base64Url) || []);
  318. var format = m[1];
  319. var bodyData = m[2];
  320. var fileBuf = wx.base64ToArrayBuffer(bodyData);
  321. cos.putObject({
  322. Bucket: config.Bucket,
  323. Region: config.Region,
  324. Key: '1.' + format,
  325. Body: fileBuf,
  326. }, requestCallback);
  327. },
  328. 'getObjectUrl 获取对象访问url': function() {
  329. var url = cos.getObjectUrl({
  330. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  331. Region: config.Region,
  332. Key: '1mb.zip',
  333. Expires: 60,
  334. Sign: true,
  335. }, function(err, data) {
  336. console.log(err || data);
  337. });
  338. console.log(url);
  339. },
  340. };
  341. var bucketDao = {
  342. // Service
  343. 'getService 获取存储桶列表': function() {
  344. cos.getService(requestCallback);
  345. },
  346. // 简单 Bucket 操作
  347. 'putBucket 创建存储桶': function() {
  348. cos.putBucket({
  349. Bucket: config.Bucket,
  350. Region: config.Region,
  351. }, requestCallback);
  352. },
  353. 'headBucket 检索存储桶及其权限': function() {
  354. cos.headBucket({
  355. Bucket: config.Bucket,
  356. Region: config.Region
  357. }, requestCallback);
  358. },
  359. 'deleteBucket 删除存储桶': function() {
  360. cos.deleteBucket({
  361. Bucket: config.Bucket,
  362. Region: config.Region
  363. }, requestCallback);
  364. },
  365. 'getBucketACL 查询存储桶 ACL': function() {
  366. cos.getBucketAcl({
  367. Bucket: config.Bucket,
  368. Region: config.Region
  369. }, requestCallback);
  370. },
  371. 'putBucketACL 设置存储桶 ACL': function() {
  372. cos.putBucketAcl({
  373. Bucket: config.Bucket,
  374. Region: config.Region,
  375. ACL: 'public-read'
  376. }, requestCallback);
  377. },
  378. 'getBucketCors 查询跨域配置': function() {
  379. cos.getBucketCors({
  380. Bucket: config.Bucket,
  381. Region: config.Region
  382. }, requestCallback);
  383. },
  384. 'putBucketCors 设置跨域配置': function() {
  385. cos.putBucketCors({
  386. Bucket: config.Bucket,
  387. Region: config.Region,
  388. CORSRules: [{
  389. "AllowedOrigin": ["*"],
  390. "AllowedMethod": ["GET", "POST", "PUT", "DELETE", "HEAD"],
  391. "AllowedHeader": ["*"],
  392. "ExposeHeader": ["ETag", "Content-Length"],
  393. "MaxAgeSeconds": "5"
  394. }]
  395. }, requestCallback);
  396. },
  397. 'deleteBucketCors 删除跨域配置': function() {
  398. cos.deleteBucketCors({
  399. Bucket: config.Bucket,
  400. Region: config.Region
  401. }, requestCallback);
  402. },
  403. 'putBucketPolicy 设置存储桶策略': function() {
  404. var AppId = config.Bucket.substr(config.Bucket.lastIndexOf('-') + 1);
  405. cos.putBucketPolicy({
  406. Bucket: config.Bucket,
  407. Region: config.Region,
  408. Policy: {
  409. "version": "2.0",
  410. "principal": {
  411. "qcs": ["qcs::cam::uin/10001:uin/10001"]
  412. }, // 这里的 10001 是 QQ 号
  413. "statement": [{
  414. "effect": "allow",
  415. "action": [
  416. "name/cos:GetBucket",
  417. "name/cos:PutObject",
  418. "name/cos:PostObject",
  419. "name/cos:PutObjectCopy",
  420. "name/cos:InitiateMultipartUpload",
  421. "name/cos:UploadPart",
  422. "name/cos:UploadPartCopy",
  423. "name/cos:CompleteMultipartUpload",
  424. "name/cos:AbortMultipartUpload",
  425. "name/cos:AppendObject"
  426. ],
  427. // "resource": ["qcs::cos:ap-guangzhou:uid/1250000000:test-1250000000/*"] // 1250000000 是 appid
  428. "resource": ["qcs::cos:" + config.Region + ":uid/" + AppId + ":" + config.Bucket + "/*"] // 1250000000 是 appid
  429. }]
  430. },
  431. }, requestCallback);
  432. },
  433. 'getBucketPolicy 查询存储桶策略': function() {
  434. cos.getBucketPolicy({
  435. Bucket: config.Bucket,
  436. Region: config.Region
  437. }, requestCallback);
  438. },
  439. 'deleteBucketPolicy 删除存储桶策略': function() {
  440. cos.deleteBucketPolicy({
  441. Bucket: config.Bucket,
  442. Region: config.Region
  443. }, requestCallback);
  444. },
  445. 'getBucketLocation 获取Bucket的地域信息': function() {
  446. cos.getBucketLocation({
  447. Bucket: config.Bucket,
  448. Region: config.Region
  449. }, requestCallback);
  450. },
  451. 'getBucketTagging 获取Bucket标签': function() {
  452. cos.getBucketTagging({
  453. Bucket: config.Bucket,
  454. Region: config.Region
  455. }, requestCallback);
  456. },
  457. 'putBucketTagging 设置Bucket标签': function() {
  458. cos.putBucketTagging({
  459. Bucket: config.Bucket,
  460. Region: config.Region,
  461. Tagging: {
  462. "Tags": [
  463. {
  464. "Key": "k1",
  465. "Value": "v1"
  466. },
  467. {
  468. "Key": "k2",
  469. "Value": "v2"
  470. }
  471. ]
  472. }
  473. }, requestCallback);
  474. },
  475. 'deleteBucketTagging 删除存储桶标签': function() {
  476. cos.deleteBucketTagging({
  477. Bucket: config.Bucket,
  478. Region: config.Region
  479. }, requestCallback);
  480. },
  481. };
  482. var objectDao = {
  483. 'getBucket 获取对象列表': function() {
  484. cos.getBucket({
  485. Bucket: config.Bucket,
  486. Region: config.Region
  487. }, requestCallback);
  488. },
  489. // 上传文件适用于单请求上传大文件
  490. 'postObject 表单上传对象': function() {
  491. wx.chooseImage({
  492. count: 1, // 默认9
  493. sizeType: ['original'], // 可以指定是原图还是压缩图,默认二者都有
  494. sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
  495. success: function(res) {
  496. var file = res.tempFiles[0];
  497. cos.postObject({
  498. Bucket: config.Bucket,
  499. Region: config.Region,
  500. Key: '1.png',
  501. FilePath: file.path,
  502. onTaskReady: function(taskId) {
  503. TaskId = taskId
  504. },
  505. onProgress: function(info) {
  506. console.log(JSON.stringify(info));
  507. }
  508. }, requestCallback);
  509. }
  510. })
  511. },
  512. 'putObject 简单上传文件': function(type) {
  513. wx.chooseMessageFile({
  514. count: 10,
  515. type: 'all',
  516. success: function(res) {
  517. var file = res.tempFiles[0];
  518. wxfs.readFile({
  519. filePath: file.path,
  520. success: function (res) {
  521. cos.putObject({
  522. Bucket: config.Bucket,
  523. Region: config.Region,
  524. Key: file.name,
  525. Body: res.data, // 在小程序里,putObject 接口只允许传字符串的内容,不支持 TaskReady 和 onProgress,上传请使用 cos.postObject 接口
  526. Headers: {
  527. // 万象持久化接口,上传时持久化。例子:通过 imageMogr2 接口使用图片缩放功能:指定图片宽度为 200,宽度等比压缩
  528. // 'Pic-Operations': '{"is_pic_info": 1, "rules": [{"fileid": "desample_photo.jpg", "rule": "imageMogr2/thumbnail/200x/"}]}'
  529. },
  530. }, requestCallback);
  531. },
  532. fail: err => console.error(err),
  533. });
  534. },
  535. fail: err => console.error(err),
  536. });
  537. },
  538. 'putObject 上传字符串': function(type) {
  539. cos.putObject({
  540. Bucket: config.Bucket,
  541. Region: config.Region,
  542. Key: '1.txt',
  543. Body: 'hello world', // 在小程序里,putObject 接口只允许传字符串的内容,不支持 TaskReady 和 onProgress,上传请使用 cos.postObject 接口
  544. Headers: {
  545. aa: 123,
  546. },
  547. Query: {
  548. bb: 123,
  549. },
  550. }, requestCallback);
  551. },
  552. // 上传文件
  553. 'putObject base64 转 ArrayBuffer 上传': function() {
  554. var base64Url = '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==';
  555. var m = (/data:image\/(\w+);base64,(.*)/.exec(base64Url) || []);
  556. var format = m[1];
  557. var bodyData = m[2];
  558. var fileBuf = wx.base64ToArrayBuffer(bodyData);
  559. cos.putObject({
  560. Bucket: config.Bucket,
  561. Region: config.Region,
  562. Key: '1.' + format,
  563. Body: fileBuf,
  564. }, requestCallback);
  565. },
  566. 'getObject 下载对象': function() {
  567. cos.getObject({
  568. Bucket: config.Bucket,
  569. Region: config.Region,
  570. Key: '1.png',
  571. // 下载时使用图片处理
  572. // QueryString: `imageMogr2/thumbnail/200x/`,
  573. }, requestCallback);
  574. },
  575. 'headObject 检索对象': function() {
  576. cos.headObject({
  577. Bucket: config.Bucket,
  578. Region: config.Region,
  579. Key: '1.txt'
  580. }, requestCallback);
  581. },
  582. 'deleteObject 删除对象': function() {
  583. cos.deleteObject({
  584. Bucket: config.Bucket,
  585. Region: config.Region,
  586. Key: '1.txt'
  587. }, requestCallback);
  588. },
  589. 'getObjectACL 获取对象ACL': function() {
  590. cos.getObjectAcl({
  591. Bucket: config.Bucket,
  592. Region: config.Region,
  593. Key: '1.txt'
  594. }, requestCallback);
  595. },
  596. 'putObjectACL 设置对象ACL': function() {
  597. cos.putObjectAcl({
  598. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  599. Region: config.Region,
  600. Key: '1.txt',
  601. // GrantFullControl: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  602. // GrantWrite: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  603. // GrantRead: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"',
  604. // ACL: 'public-read-write',
  605. // ACL: 'public-read',
  606. // ACL: 'private',
  607. ACL: 'default', // 继承上一级目录权限
  608. // AccessControlPolicy: {
  609. // "Owner": { // AccessControlPolicy 里必须有 owner
  610. // "ID": 'qcs::cam::uin/459000000:uin/459000000' // 459000000 是 Bucket 所属用户的 QQ 号
  611. // },
  612. // "Grants": [{
  613. // "Grantee": {
  614. // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 QQ 号
  615. // },
  616. // "Permission": "READ"
  617. // }]
  618. // }
  619. }, requestCallback);
  620. },
  621. 'deleteMultipleObject 批量删除对象': function() {
  622. cos.deleteMultipleObject({
  623. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  624. Region: config.Region,
  625. Objects: [{
  626. Key: '1.txt'
  627. },
  628. {
  629. Key: '1.copy.txt'
  630. },
  631. ]
  632. }, requestCallback);
  633. },
  634. 'putObjectCopy 复制对象': function() {
  635. cos.putObjectCopy({
  636. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  637. Region: config.Region,
  638. Key: '1.copy.txt',
  639. CopySource: config.Bucket + '.cos.' + config.Region + '.myqcloud.com/1.txt',
  640. }, requestCallback);
  641. },
  642. 'restoreObject 恢复归档对象': function() {
  643. cos.restoreObject({
  644. Bucket: config.Bucket,
  645. Region: config.Region,
  646. Key: '1.txt',
  647. RestoreRequest: {
  648. Days: 1,
  649. CASJobParameters: {
  650. Tier: 'Expedited'
  651. }
  652. }
  653. }, requestCallback);
  654. },
  655. 'appendObject 追加上传': function() {
  656. // 初始化一个可追加上传的对象append.txt
  657. cos.appendObject({
  658. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  659. Region: config.Region,
  660. Key: 'append.txt', /* 必须 */
  661. Body: '12345',
  662. Position: 0,
  663. },
  664. function(err, data) {
  665. logger.log('putObject:', err || data);
  666. })
  667. },
  668. 'appendObject_continue 继续追加上传': function() {
  669. // append.txt必须是一个可追加上传的对象,参考文档:https://cloud.tencent.com/document/product/436/7741
  670. cos.headObject({
  671. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  672. Region: config.Region,
  673. Key: 'append.txt', /* 必须 */
  674. }, function(err, data) {
  675. if (err) return console.log(err);
  676. // 首先取到要追加的文件当前长度,即需要上送的Position
  677. var position = data.headers['content-length'];
  678. cos.appendObject({
  679. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  680. Region: config.Region,
  681. Key: 'append.txt', /* 必须 */
  682. Body: '66666',
  683. Position: position,
  684. },
  685. function(err, data) {
  686. // 也可以取到下一次上传的position继续追加上传
  687. // var nextPosition = data.headers['x-cos-next-append-position'];
  688. logger.log('putObject:', err || data);
  689. })
  690. });
  691. },
  692. 'abortUploadTask 抛弃分块上传任务': function() {
  693. cos.abortUploadTask({
  694. Bucket: config.Bucket,
  695. /* 必须 */ // Bucket 格式:test-1250000000
  696. Region: config.Region,
  697. /* 必须 */
  698. // 格式1,删除单个上传任务
  699. // Level: 'task',
  700. // Key: '10mb.zip',
  701. // UploadId: '14985543913e4e2642e31db217b9a1a3d9b3cd6cf62abfda23372c8d36ffa38585492681e3',
  702. // 格式2,删除单个文件所有未完成上传任务
  703. Level: 'file',
  704. Key: '10mb.zip',
  705. // 格式3,删除 Bucket 下所有未完成上传任务
  706. // Level: 'bucket',
  707. }, requestCallback);
  708. },
  709. }
  710. var advanceObjectDao = {
  711. 'sliceUploadFile 分块上传': function() {
  712. var sliceUploadFile = function (file) {
  713. var key = file.name;
  714. cos.sliceUploadFile({
  715. Bucket: config.Bucket,
  716. Region: config.Region,
  717. Key: key,
  718. FilePath: file.path,
  719. FileSize: file.size,
  720. CacheControl: 'max-age=7200',
  721. Headers: {
  722. aa: 123,
  723. },
  724. Query: {
  725. bb: 123,
  726. },
  727. onTaskReady: function(taskId) {
  728. TaskId = taskId
  729. },
  730. onHashProgress: function(info) {
  731. console.log('check hash', JSON.stringify(info));
  732. },
  733. onProgress: function(info) {
  734. console.log(JSON.stringify(info));
  735. }
  736. }, requestCallback);
  737. };
  738. wx.chooseMessageFile({
  739. count: 10,
  740. type: 'all',
  741. success: function(res) {
  742. sliceUploadFile(res.tempFiles[0]);
  743. }
  744. });
  745. // wx.chooseVideo({
  746. // sourceType: ['album','camera'],
  747. // maxDuration: 60,
  748. // camera: 'back',
  749. // success(res) {
  750. // var name = res.tempFilePath.replace(/^.*?([^/]{32}\.\w+)$/, '$1');
  751. // sliceUploadFile({
  752. // name: name,
  753. // path: res.tempFilePath,
  754. // size: res.size,
  755. // });
  756. // },
  757. // fail(err) {
  758. // console.log(err);
  759. // }
  760. // })
  761. },
  762. 'sliceCopyFile 分块复制对象': function() {
  763. // 创建测试文件
  764. var sourceName = '1.txt';
  765. var Key = '1.slicecopy.exe';
  766. var sourcePath = config.Bucket + '.cos.' + config.Region + '.myqcloud.com/' + sourceName;
  767. cos.sliceCopyFile({
  768. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  769. Region: config.Region,
  770. Key: Key,
  771. CopySource: sourcePath,
  772. SliceSize: 20 * 1024 * 1024, // 大于20M的文件用分片复制,小于则用单片复制
  773. onProgress: function(info) {
  774. var percent = parseInt(info.percent * 10000) / 100;
  775. var speed = parseInt(info.speed / 1024 / 1024 * 100) / 100;
  776. console.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
  777. }
  778. }, requestCallback);
  779. },
  780. cancelTask: function() {
  781. cos.cancelTask(TaskId);
  782. console.log('canceled');
  783. },
  784. pauseTask: function() {
  785. cos.pauseTask(TaskId);
  786. console.log('paused');
  787. },
  788. restartTask: function() {
  789. cos.restartTask(TaskId);
  790. console.log('restart');
  791. },
  792. };
  793. var ciObjectDao = {
  794. '上传时使用图片处理': function(){
  795. wx.chooseMessageFile({
  796. count: 10,
  797. type: 'all',
  798. success: function (res) {
  799. var file = res.tempFiles[0];
  800. wxfs.readFile({
  801. filePath: file.path,
  802. success: function (res) {
  803. cos.putObject({
  804. Bucket: config.Bucket, // Bucket 格式:test-1250000000
  805. Region: config.Region,
  806. Key: file.name,
  807. Body: res.data,
  808. Headers: {
  809. // 通过 imageMogr2 接口使用图片缩放功能:指定图片宽度为 200,宽度等比压缩
  810. 'Pic-Operations':
  811. '{"is_pic_info": 1, "rules": [{"fileid": "desample_photo.jpg", "rule": "imageMogr2/thumbnail/200x/"}]}',
  812. },
  813. },
  814. requestCallback,
  815. );
  816. },
  817. fail: (err) => console.error(err),
  818. });
  819. },
  820. fail: (err) => console.error(err),
  821. });
  822. },
  823. '对云上数据进行图片处理': function(){
  824. // 对云上数据进行图片处理
  825. cos.request({
  826. Bucket: config.Bucket,
  827. Region: config.Region,
  828. Key: 'photo.png',
  829. Method: 'POST',
  830. Action: 'image_process',
  831. Headers: {
  832. // 通过 imageMogr2 接口使用图片缩放功能:指定图片宽度为 200,宽度等比压缩
  833. 'Pic-Operations': '{"is_pic_info": 1, "rules": [{"fileid": "desample_photo.jpg", "rule": "imageMogr2/thumbnail/200x/"}]}'
  834. },
  835. }, requestCallback);
  836. },
  837. '下载时使用图片处理': function(){
  838. cos.getObject({
  839. Bucket: config.Bucket,
  840. Region: config.Region,
  841. Key: '1.png',
  842. QueryString: `imageMogr2/thumbnail/200x/`,
  843. }, requestCallback);
  844. },
  845. '生成带图片处理参数的签名 URL': function(){
  846. // 生成带图片处理参数的文件签名URL,过期时间设置为 30 分钟。
  847. cos.getObjectUrl({
  848. Bucket: config.Bucket,
  849. Region: config.Region,
  850. Key: 'photo.png',
  851. QueryString: `imageMogr2/thumbnail/200x/`,
  852. Expires: 1800,
  853. Sign: true,
  854. },
  855. (err, data) => {
  856. console.log('带签名', err || data);
  857. });
  858. // 生成带图片处理参数的文件URL,不带签名。
  859. cos.getObjectUrl({
  860. Bucket: config.Bucket,
  861. Region: config.Region,
  862. Key: 'photo.png',
  863. QueryString: `imageMogr2/thumbnail/200x/`,
  864. Sign: false,
  865. },
  866. (err, data) => {
  867. console.log('不带签名', err || data);
  868. });
  869. },
  870. 'describeMediaBuckets 查询已经开通数据万象功能的存储桶': function() {
  871. var host = 'ci.' + config.Region + '.myqcloud.com';
  872. var url = 'https://' + host + '/mediabucket';
  873. cos.request({
  874. Bucket: config.Bucket,
  875. Region: config.Region,
  876. Method: 'GET',
  877. Key: 'mediabucket', /** 固定值,必须 */
  878. Url: url,
  879. Query: {
  880. pageNumber: '1', /** 第几页,非必须 */
  881. pageSize: '10', /** 每页个数,非必须 */
  882. // regions: 'ap-chengdu', /** 地域信息,例如'ap-beijing',支持多个值用逗号分隔如'ap-shanghai,ap-beijing',非必须 */
  883. // bucketNames: 'test-1250000000', /** 存储桶名称,精确搜索,例如'test-1250000000',支持多个值用逗号分隔如'test1-1250000000,test2-1250000000',非必须 */
  884. // bucketName: 'test', /** 存储桶名称前缀,前缀搜索,例如'test',支持多个值用逗号分隔如'test1,test2',非必须 */
  885. }
  886. },
  887. function(err, data){
  888. console.log(err || data);
  889. });
  890. },
  891. 'getMediaInfo 获取媒体文件信息': function() {
  892. cos.request({
  893. Bucket: config.Bucket,
  894. Region: config.Region,
  895. Method: 'GET',
  896. Key: 'test.mp4',
  897. Query: {
  898. 'ci-process': 'videoinfo' /** 固定值,必须 */
  899. }
  900. },
  901. function(err, data){
  902. console.log(err || data);
  903. });
  904. },
  905. 'getSnapshot 获取媒体文件某个时间的截图': function() {
  906. cos.request({
  907. Bucket: config.Bucket,
  908. Region: config.Region,
  909. Method: 'GET',
  910. Key: 'test.mp4',
  911. Query: {
  912. 'ci-process': 'snapshot', /** 固定值,必须 */
  913. time: 1, /** 截图的时间点,单位为秒,必须 */
  914. // width: 0, /** 截图的宽,非必须 */
  915. // height: 0, /** 截图的高,非必须 */
  916. // format: 'jpg', /** 截图的格式,支持 jpg 和 png,默认 jpg,非必须 */
  917. // rotate: 'auto', /** 图片旋转方式,默认为'auto',非必须 */
  918. // mode: 'exactframe', /** 截帧方式,默认为'exactframe',非必须 */
  919. },
  920. RawBody: true,
  921. },
  922. function(err, data){
  923. console.log(err || data);
  924. });
  925. },
  926. }
  927. // require('./test');
  928. module.exports = {
  929. toolsDao: toolsDao,
  930. bucketDao: bucketDao,
  931. objectDao: objectDao,
  932. advanceObjectDao: advanceObjectDao,
  933. ciObjectDao: ciObjectDao,
  934. };