doum
2026-06-11 d9c657aa78cf0ebe31933a87e63ca92edd8a8da3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import request from '../../utils/request'
import axios from 'axios'
import Cookies from 'js-cookie'
 
export function fetchList (data) {
  return request.post('/visitsAdmin/cloudService/business/collectionStation/media/page', data, { trim: true })
}
 
/** 预览接口 URL */
export function buildPreviewUrl (id) {
  const token = Cookies.get('dm_user_token') || ''
  const base = process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/business/collectionStation/media/preview/' + id
  return token ? `${base}?dm_user_token=${encodeURIComponent(token)}` : base
}
 
/** 下载到本地接口 URL */
export function buildDownloadUrl (id) {
  const token = Cookies.get('dm_user_token') || ''
  const base = process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/business/collectionStation/media/download/' + id
  return token ? `${base}?dm_user_token=${encodeURIComponent(token)}` : base
}
 
function authHeaders () {
  const token = Cookies.get('dm_user_token')
  return token ? { dm_user_token: token } : {}
}
 
function rejectBlobError (blob) {
  if (!blob || blob.size === 0) {
    return Promise.reject(new Error('文件为空'))
  }
  if (blob.type && blob.type.includes('json')) {
    return blob.text().then(text => {
      let message = '操作失败'
      try {
        const json = JSON.parse(text)
        message = json.message || message
      } catch (e) {
        message = text || message
      }
      return Promise.reject(new Error(message))
    })
  }
  return Promise.resolve(blob)
}
 
/** 预览接口拉取文本(txt/log) */
export function fetchPreviewText (id) {
  return axios({
    url: buildPreviewUrl(id),
    method: 'get',
    responseType: 'text',
    headers: authHeaders()
  }).then(res => {
    const data = res.data
    if (typeof data === 'string' && data.trim().startsWith('{') && data.includes('"success"')) {
      try {
        const json = JSON.parse(data)
        if (json.success === false) {
          return Promise.reject(new Error(json.message || '预览失败'))
        }
      } catch (e) {
        // 非 JSON 响应,按文本展示
      }
    }
    return data || ''
  })
}
 
export function fetchPreviewBlob (id) {
  return axios({
    url: buildPreviewUrl(id),
    method: 'get',
    responseType: 'blob',
    headers: authHeaders()
  }).then(res => rejectBlobError(res.data))
}
 
/** 下载已入库媒体到本地 */
export function fetchMediaFile (id) {
  return axios({
    url: buildDownloadUrl(id),
    method: 'get',
    responseType: 'blob',
    headers: authHeaders()
  }).then(res => {
    if (res.headers['content-type'] === 'application/json') {
      return rejectBlobError(res.data).then(() => res)
    }
    return res
  })
}
 
/** 校验 Blob 是否为 MP4 容器 */
export function ensureMp4Blob (blob) {
  return blob.slice(0, 12).arrayBuffer().then(buf => {
    const arr = new Uint8Array(buf)
    const isMp4 = arr.length >= 8 && arr[4] === 0x66 && arr[5] === 0x74 && arr[6] === 0x79 && arr[7] === 0x70
    if (!isMp4) {
      return Promise.reject(new Error('文件不是有效的 MP4 格式,请重新下载该媒体'))
    }
    return new Blob([blob], { type: 'video/mp4' })
  })
}