txOssSts.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /**
  2. * 微信小程序通过STS直传阿里云OSS
  3. *(uniapp版上传,小程序原生需要将uni.XXX替换为wx.XXX)
  4. *
  5. * @param {filePath} 图片临时地址
  6. * @param {option|Object} OSS和STS配置
  7. * @param {savePath} oss中的文件目录
  8. * @param {AccessKeySecret} 服务端返回的STS中的AccessKeySecret
  9. * @param {SecurityToken} 服务端返回的STS中的SecurityToken
  10. * @param {AccessKeyId} 服务端返回的STS中的AccessKeyId
  11. * @param {bucket} 存储桶
  12. * @param {area} 地区
  13. * @return {string|boolean} 成功返回文件地址,失败返回false
  14. */
  15. // #ifdef H5
  16. //#endif
  17. // #ifdef APP-PLUS
  18. //#endif
  19. import getFileAccessUrl from "@/js_sdk/tencentcloud-plugin-cos/get-file-access-url";
  20. console.log('COS加载js版本')
  21. import COS from "cos-js-sdk-v5"
  22. // import COS from "./cos-wx-sdk-v5.min"
  23. // console.log('COS加载node版本')
  24. // import COS from "cos-nodejs-sdk-v5"
  25. import tools from "./tools";
  26. import {getTxySts} from "@/api/common";
  27. import {secretId, secretKey} from "@/uniCloud-aliyun/cloudfunctions/tencentcloud-plugin/config";
  28. // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucket
  29. let Bucket = 'icoco-1317650740';
  30. // 存储桶Region可以在COS控制台指定存储桶的概览页查看 https://console.cloud.tencent.com/cos5/bucket/
  31. // 关于地域的详情见 https://cloud.tencent.com/document/product/436/6224
  32. let Region = 'ap-guangzhou';
  33. let cos=null;
  34. /**
  35. * 获取sts权限信息
  36. * @returns {Promise<*>}
  37. */
  38. async function getSts(){
  39. let cosToken=tools.getCosToken()
  40. if(!cosToken) {
  41. let res =await getTxySts()
  42. if(res.code===0){
  43. tools.setCosToken(res.data)
  44. setTimeout(()=>{
  45. cos=null
  46. tools.delCosToken()
  47. },(res.data.expiredTime-res.data.startTime))
  48. }
  49. }
  50. return cosToken
  51. }
  52. function startCos(){
  53. console.log('startCos-----------------')
  54. cos = new COS({
  55. getAuthorization:async function (options, callback) {
  56. console.log('---------------获取初始化信息')
  57. let cosToken= await getSts()
  58. console.log(cosToken)
  59. callback({
  60. TmpSecretId: cosToken.credentials.tmpSecretId,
  61. TmpSecretKey: cosToken.credentials.tmpSecretKey,
  62. XCosSecurityToken: cosToken.credentials.sessionToken,
  63. StartTime: cosToken.startTime*1, // 时间戳,单位秒,如:1580000000,建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
  64. ExpiredTime: cosToken.expiredTime*1, // 时间戳,单位秒,如:1580000900
  65. })
  66. }
  67. });
  68. }
  69. let cosServe={}
  70. /**
  71. * COS文件上传
  72. * @param file
  73. * @param folder 上传目录
  74. * @returns {Promise<unknown>}
  75. */
  76. cosServe.txUploadFile=function (file,folder){
  77. if(cos===null){
  78. console.log('对象初始化')
  79. //初始化对象
  80. startCos();
  81. }
  82. //默认为个人目录gallery
  83. folder=folder==='moment'?'moment':'gallery'
  84. // tools.showLoading()
  85. return new Promise((resolve, reject) => {
  86. console.log('cos-*-------------------------',cos)
  87. console.log(file)
  88. console.log(folder+'/'+tools.getDate()+tools.getRandFileName(file.name))
  89. // 分片上传文件
  90. cos.putObject({
  91. Bucket: Bucket,
  92. Region: Region,
  93. Key: folder+'/'+tools.getDate()+'/'+tools.getRandFileName(file.name),
  94. Body: file,
  95. onHashProgress: function (progressData) {
  96. console.log('校验中', JSON.stringify(progressData));
  97. },
  98. onProgress: function (progressData) {
  99. console.log('上传中', JSON.stringify(progressData));
  100. },
  101. }, function (err, data) {
  102. tools.hideLoading()
  103. console.log(err);
  104. console.log(data);
  105. if(data.Location!==undefined){
  106. data.Location='https://'+data.Location;
  107. resolve( data)
  108. }else {
  109. resolve( false)
  110. }
  111. });
  112. })
  113. }
  114. cosServe.getSignObject=async function (url){
  115. if(!url){
  116. return ''
  117. }
  118. console.log(url)
  119. url= url.replace('https://','')
  120. url= url.replace('http://','')
  121. url= url.replace('icoco-1317650740.cos.ap-guangzhou.myqcloud.com/','')
  122. let signUrl = await getFileAccessUrl(url);
  123. console.log(signUrl)
  124. return signUrl
  125. }
  126. cosServe.getSignUrl= function (url){
  127. if(!url){
  128. return ''
  129. }
  130. if(cos===null){
  131. startCos();
  132. }
  133. console.log(url)
  134. url= url.replace('https://','')
  135. url= url.replace('http://','')
  136. url= url.replace('icoco-1317650740.cos.ap-guangzhou.myqcloud.com/','')
  137. console.log(url)
  138. console.log('开始签名----------------------------'+url)
  139. console.log({
  140. Bucket: Bucket,
  141. Region: Region,
  142. Key: url, /* 存储在桶里的对象键(例如1.jpg,a/b/test.txt),支持中文,必须字段 */
  143. })
  144. return new Promise((resolve, reject) => {
  145. cos.getObjectUrl({
  146. Bucket: Bucket,
  147. Region: Region,
  148. Key: url, /* 存储在桶里的对象键(例如1.jpg,a/b/test.txt),支持中文,必须字段 */
  149. },
  150. function (err, data) {
  151. console.log(err || data.Url);
  152. if(err){
  153. resolve('')
  154. }else {
  155. resolve(data.Url)
  156. }
  157. })
  158. })
  159. }
  160. export default cosServe