aliOssSts.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. import crypto from 'crypto-js';
  16. import {Base64} from 'js-base64/base64.js';
  17. function upload(filePath, option = {
  18. savePath,
  19. AccessKeySecret,
  20. SecurityToken,
  21. AccessKeyId,
  22. bucket,
  23. area
  24. }, callBack = () => {}) {
  25. let fileType = filePath.split(".").pop();
  26. let filename = option.savePath + "/" + createFileName(32) + "." + fileType;
  27. const date = new Date();
  28. date.setHours(date.getHours() + 1);
  29. const policyText = {
  30. expiration: date.toISOString(), // 设置policy过期时间。
  31. conditions: [
  32. ["content-length-range", 0, 1024 * 1024 * 1024],
  33. ],
  34. };
  35. const policy = Base64.encode(JSON.stringify(policyText)) // policy必须为base64的string。
  36. const signature = computeSignature(option.AccessKeySecret, policy)
  37. const formData = {
  38. OSSAccessKeyId: option.AccessKeyId,
  39. signature,
  40. policy,
  41. 'x-oss-security-token': option.SecurityToken,
  42. key: filename,
  43. success_action_status: 200
  44. }
  45. uni.uploadFile({
  46. url: "https://" + option.bucket +
  47. "." + option.area + ".aliyuncs.com",
  48. filePath: filePath,
  49. name: "file",
  50. formData: formData,
  51. success: (res) => {
  52. let ossFileName = false;
  53. if (res.statusCode === 200) {
  54. // console.log('上传成功');
  55. ossFileName = "https://" + option.bucket +
  56. "." + option.area + ".aliyuncs.com/" +
  57. filename;
  58. }
  59. callBack(ossFileName);
  60. },
  61. fail: err => {
  62. // console.log(err);
  63. callBack(false);
  64. }
  65. })
  66. }
  67. // 签名
  68. function computeSignature(accessKeySecret, canonicalString) {
  69. return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecret));
  70. }
  71. // 生成随机文件名
  72. function createFileName(length) {
  73. const data = [
  74. "0",
  75. "1",
  76. "2",
  77. "3",
  78. "4",
  79. "5",
  80. "6",
  81. "7",
  82. "8",
  83. "9",
  84. "A",
  85. "B",
  86. "C",
  87. "D",
  88. "E",
  89. "F",
  90. "G",
  91. "H",
  92. "I",
  93. "J",
  94. "K",
  95. "L",
  96. "M",
  97. "N",
  98. "O",
  99. "P",
  100. "Q",
  101. "R",
  102. "S",
  103. "T",
  104. "U",
  105. "V",
  106. "W",
  107. "X",
  108. "Y",
  109. "Z",
  110. "a",
  111. "b",
  112. "c",
  113. "d",
  114. "e",
  115. "f",
  116. "g",
  117. "h",
  118. "i",
  119. "j",
  120. "k",
  121. "l",
  122. "m",
  123. "n",
  124. "o",
  125. "p",
  126. "q",
  127. "r",
  128. "s",
  129. "t",
  130. "u",
  131. "v",
  132. "w",
  133. "x",
  134. "y",
  135. "z",
  136. ];
  137. let nums = "";
  138. for (let i = 0; i < length; i++) {
  139. const r = parseInt(Math.random() * 61, 10);
  140. nums += data[r];
  141. }
  142. return nums;
  143. }
  144. export default {
  145. upload
  146. }