index.js 3.3 KB

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