西藏巴青项目

filePreview.js 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { resolveResourceUrl } from '@/utils/resourceUrl'
  2. const IMAGE_RE = /\.(png|jpe?g|gif|webp|bmp)$/i
  3. const VIDEO_RE = /\.(mp4|mov|m4v|webm|avi)$/i
  4. const PDF_RE = /\.pdf$/i
  5. /** 根据路径后缀判断附件类型 */
  6. export function resolveMediaKind(path) {
  7. const raw = (path || '').trim()
  8. if (!raw) return 'none'
  9. const p = raw.split('?')[0]
  10. if (IMAGE_RE.test(p)) return 'image'
  11. if (VIDEO_RE.test(p)) return 'video'
  12. if (PDF_RE.test(p)) return 'pdf'
  13. return 'file'
  14. }
  15. /** 从 URL 取文件名 */
  16. export function fileNameFromPath(path) {
  17. const p = (path || '').split('?')[0]
  18. const seg = p.split('/').filter(Boolean)
  19. if (!seg.length) return 'attachment'
  20. try {
  21. return decodeURIComponent(seg[seg.length - 1])
  22. } catch (e) {
  23. return seg[seg.length - 1]
  24. }
  25. }
  26. /** 在线预览完整 URL(/profile/** 后端 permitAll,可直接访问) */
  27. export function getOnlinePreviewUrl(path) {
  28. return resolveResourceUrl(path)
  29. }
  30. const FILE_PREVIEW_PAGE = '/package-a/file-preview/index'
  31. /**
  32. * 在线打开附件(不下载到本地)
  33. * H5:新窗口;小程序/App 跳转 web-view 页
  34. */
  35. export function openOnlinePreview(path, { title } = {}) {
  36. const url = getOnlinePreviewUrl(path)
  37. if (!url) {
  38. return Promise.reject(new Error('empty url'))
  39. }
  40. // #ifdef H5
  41. if (typeof window !== 'undefined') {
  42. window.open(url, '_blank')
  43. return Promise.resolve()
  44. }
  45. return Promise.reject(new Error('unsupported'))
  46. // #endif
  47. // #ifdef APP-PLUS
  48. if (typeof plus !== 'undefined' && plus.runtime) {
  49. plus.runtime.openURL(url)
  50. return Promise.resolve()
  51. }
  52. // #endif
  53. const q = [`url=${encodeURIComponent(url)}`]
  54. if (title) {
  55. q.push(`title=${encodeURIComponent(title)}`)
  56. }
  57. return new Promise((resolve, reject) => {
  58. uni.navigateTo({
  59. url: `${FILE_PREVIEW_PAGE}?${q.join('&')}`,
  60. success: () => resolve(),
  61. fail: reject
  62. })
  63. })
  64. }