裂变星小程序-25.03.04
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
3.3 KiB

1 month ago
  1. /**
  2. * 阿里云OSS工具类
  3. */
  4. import OSSConfig from "@/utils/oss-upload/oss/OSSConfig.js"
  5. import ossConfig from '@/config.js'
  6. /**
  7. * 生成一个随机的Key
  8. */
  9. function storeKey() {
  10. let s = [];
  11. let hexDigits = "0123456789abcdef";
  12. for (let i = 0; i < 36; i++) {
  13. s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  14. }
  15. s[14] = "4";
  16. s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
  17. s[8] = s[13] = s[18] = s[23] = "-";
  18. return s.join("");
  19. }
  20. /**
  21. * 根据当天日期在OSS端生成文件夹
  22. */
  23. function storeFolder() {
  24. const date = new Date();
  25. const formatNumber = n => {
  26. n = n.toString()
  27. return n[1] ? n : '0' + n
  28. }
  29. return [date.getFullYear(), date.getMonth() + 1, date.getDate()].map(formatNumber).join('-')
  30. }
  31. /**
  32. * 阿里云OSS上传文件, 所有具体功能的工具函数均基于此
  33. * 注意, resolve时一定为上传成功, 返回OSS上的Key
  34. * @param filePath 待上传文件的URI
  35. * @param key 存储桶中的目标文件名
  36. * @param folder 存储桶中的目标文件夹
  37. */
  38. export function ossUpload(filePath, key = storeKey(), folder = storeFolder()) {
  39. return new Promise((resolve, reject) => {
  40. if (folder && folder?.length > 0) {
  41. if (folder[0] == "/") folder = folder.slice(1, folder.length)
  42. if (folder[folder.length - 1] != "/") folder += "/"
  43. key = folder + key
  44. }
  45. const filePrefixArr = filePath.split(".")
  46. key += `.${filePrefixArr[filePrefixArr.length - 1]}`
  47. let config = {
  48. url: OSSConfig.host,
  49. name: 'file',
  50. filePath,
  51. formData: {
  52. key,
  53. policy: OSSConfig.policyBase64,
  54. OSSAccessKeyId: OSSConfig.accessid,
  55. success_action_status: '200',
  56. signature: OSSConfig.signature,
  57. },
  58. success(res) {
  59. if (res.errMsg.includes("uploadFile:ok")) {
  60. resolve(ossConfig.aliOss.url + key)
  61. } else {
  62. reject(res)
  63. }
  64. },
  65. fail(err) {
  66. reject(err)
  67. }
  68. }
  69. uni.uploadFile(config)
  70. })
  71. }
  72. /**
  73. * 阿里云OSS上传图片
  74. * @param {compressed, key, folder, success, fail} compressed: 是否压缩 key: 存储桶中的目标文件名 folder: 存储桶中的目标文件夹
  75. */
  76. export function ossUploadImage({
  77. key,
  78. folder,
  79. compressed = true, //是否压缩
  80. success, //成功时的回调
  81. fail //失败时的回调
  82. }) {
  83. const sizeType = [compressed ? 'compressed' : 'original']
  84. uni.chooseImage({
  85. count: 1,
  86. sizeType,
  87. success(res) {
  88. ossUpload(res.tempFilePaths[0], key, folder).then(success).catch(fail)
  89. },
  90. fail
  91. })
  92. }
  93. /**
  94. * 阿里云OSS上传视频
  95. * @param { key, folder, sourceType, compressed, maxDuration, camera, success, fail}
  96. * key: 存储桶中的目标文件名 folder: 存储桶中的目标文件夹 其它参数同uni.chooseVideo(mpWeixin)
  97. */
  98. export function ossUploadVideo({
  99. key,
  100. folder,
  101. sourceType = ['album', 'camera'], //album 从相册选视频, camera 使用相机拍摄
  102. compressed = true, //是否压缩所选的视频源文件
  103. maxDuration = 60, //拍摄视频最长拍摄时间, 单位秒。最长支持 60 秒
  104. camera = 'back', //调用相机方向, 'front'、'back', 默认'back'
  105. success, //成功时的回调
  106. fail //失败时的回调
  107. }) {
  108. uni.chooseVideo({
  109. sourceType,
  110. compressed,
  111. maxDuration,
  112. camera,
  113. success(res) {
  114. ossUpload(res.tempFilePath, key, folder).then(success).catch(fail)
  115. },
  116. fail
  117. })
  118. }
  119. const OSS = {
  120. ossUploadVideo,
  121. ossUploadImage,
  122. ossUpload
  123. }
  124. export default OSS;