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' }) }) }