txOssSts.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. console.log('COS加载js版本')
  20. import COS from "cos-js-sdk-v5"
  21. // import COS from "./cos-wx-sdk-v5.min"
  22. // console.log('COS加载node版本')
  23. // import COS from "cos-nodejs-sdk-v5"
  24. import tools from "./tools";
  25. import {getTxySts} from "@/api/common";
  26. // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucket
  27. let Bucket = 'icoco-1317650740';
  28. // 存储桶Region可以在COS控制台指定存储桶的概览页查看 https://console.cloud.tencent.com/cos5/bucket/
  29. // 关于地域的详情见 https://cloud.tencent.com/document/product/436/6224
  30. let Region = 'ap-guangzhou';
  31. let cos=null;
  32. function startCos(){
  33. console.log('startCos-----------------')
  34. cos = new COS({
  35. getAuthorization: function (options, callback) {
  36. console.log('---------------获取初始化信息')
  37. let cosToken=tools.getCosToken()
  38. console.log(cosToken)
  39. if(cosToken){
  40. callback({
  41. TmpSecretId: cosToken.credentials.tmpSecretId,
  42. TmpSecretKey: cosToken.credentials.tmpSecretKey,
  43. XCosSecurityToken: cosToken.credentials.sessionToken,
  44. StartTime: cosToken.startTime*1, // 时间戳,单位秒,如:1580000000,建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
  45. ExpiredTime: cosToken.expiredTime*1, // 时间戳,单位秒,如:1580000900
  46. })
  47. }else {
  48. getTxySts().then((res)=>{
  49. console.log('---------------获取初始化信息')
  50. if(res.code===0){
  51. tools.setCosToken(res.data)
  52. callback({
  53. TmpSecretId: res.data.credentials.tmpSecretId,
  54. TmpSecretKey: res.data.credentials.tmpSecretKey,
  55. XCosSecurityToken: res.data.credentials.sessionToken,
  56. StartTime: res.data.startTime*1, // 时间戳,单位秒,如:1580000000,建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
  57. ExpiredTime: res.data.expiredTime*1, // 时间戳,单位秒,如:1580000900
  58. })
  59. setTimeout(()=>{
  60. cos=null
  61. tools.delCosToken()
  62. },(res.data.expiredTime-res.data.startTime))
  63. }
  64. })
  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.getSignUrl= function (url){
  115. if(!url){
  116. return ''
  117. }
  118. if(cos===null){
  119. startCos();
  120. }
  121. console.log(url)
  122. url= url.replace('https://','')
  123. url= url.replace('http://','')
  124. url= url.replace('icoco-1317650740.cos.ap-guangzhou.myqcloud.com/','')
  125. console.log(url)
  126. console.log('开始签名----------------------------'+url)
  127. console.log({
  128. Bucket: Bucket,
  129. Region: Region,
  130. Key: url, /* 存储在桶里的对象键(例如1.jpg,a/b/test.txt),支持中文,必须字段 */
  131. })
  132. return new Promise((resolve, reject) => {
  133. cos.getObjectUrl({
  134. Bucket: Bucket,
  135. Region: Region,
  136. Key: url, /* 存储在桶里的对象键(例如1.jpg,a/b/test.txt),支持中文,必须字段 */
  137. },
  138. function (err, data) {
  139. console.log(err || data.Url);
  140. if(err){
  141. resolve('')
  142. }else {
  143. resolve(data.Url)
  144. }
  145. })
  146. })
  147. }
  148. export default cosServe