ossUrl.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import request from '@/utils/request'
  2. const signedUrlCache = new Map()
  3. /**
  4. * 判断是否为腾讯云COS私有存储预签名地址
  5. */
  6. export function isCosUrl(url) {
  7. if (!url || typeof url !== 'string') {
  8. return false
  9. }
  10. return url.includes('.myqcloud.com/') || url.includes('.cos.')
  11. }
  12. /**
  13. * 去除URL里预签名query参数,返回原始文件地址
  14. */
  15. export function stripSignedParams(url) {
  16. if (!url) {
  17. return url
  18. }
  19. const index = url.indexOf('?')
  20. return index > 0 ? url.substring(0, index) : url
  21. }
  22. /**
  23. * 转换存储地址为可访问链接,私有文件自动获取预签名地址
  24. */
  25. export function resolveAccessUrl(url) {
  26. const storedUrl = stripSignedParams(url)
  27. if (!storedUrl || !isCosUrl(storedUrl)) {
  28. return Promise.resolve(url)
  29. }
  30. if (signedUrlCache.has(storedUrl)) {
  31. return Promise.resolve(signedUrlCache.get(storedUrl))
  32. }
  33. return request({
  34. url: '/common/getSignedUrl',
  35. method: 'get',
  36. params: { url: storedUrl }
  37. }).then(res => {
  38. const accessUrl = (res.accessUrl || res.url || storedUrl)
  39. signedUrlCache.set(storedUrl, accessUrl)
  40. return accessUrl
  41. }).catch(() => storedUrl)
  42. }
  43. /**
  44. * 批量转换COS文件访问URL
  45. */
  46. export function resolveAccessUrls(urls) {
  47. if (!urls || !urls.length) {
  48. return Promise.resolve([])
  49. }
  50. return Promise.all(urls.map(url => resolveAccessUrl(url)))
  51. }