铝交易,微信公众号
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.

150 lines
3.8 KiB

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