64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
// Author: fruit.com.cn
|
|
|
|
import request from '@/axios'
|
|
import type { MediaAsset } from './types'
|
|
|
|
export interface UploadInitData {
|
|
fileName: string
|
|
fileSize: number
|
|
/** DRAMA_COVER / EPISODE / AVATAR */
|
|
bizType?: string
|
|
chunkSize?: number
|
|
}
|
|
|
|
export interface UploadInitResult {
|
|
uploadId: string
|
|
chunkSize: number
|
|
totalChunks: number
|
|
objectKey: string
|
|
}
|
|
|
|
export const initUploadApi = (data: UploadInitData) => {
|
|
return request.post<UploadInitResult>({ url: '/admin/media/upload/init', data })
|
|
}
|
|
|
|
/** 不设置 Content-Type,交给浏览器带 boundary */
|
|
export const uploadChunkApi = (uploadId: string, index: number, chunk: Blob, fileName: string) => {
|
|
const form = new FormData()
|
|
form.append('uploadId', uploadId)
|
|
form.append('index', String(index))
|
|
form.append('file', chunk, fileName)
|
|
return request.post<number>({ url: '/admin/media/upload/chunk', data: form })
|
|
}
|
|
|
|
export const completeUploadApi = (uploadId: string, durationSec?: number) => {
|
|
return request.post<MediaAsset>({
|
|
url: '/admin/media/upload/complete',
|
|
data: { uploadId, durationSec }
|
|
})
|
|
}
|
|
|
|
export interface UploadProgress {
|
|
uploadId: string
|
|
fileName: string
|
|
bizType: string
|
|
fileSize: number
|
|
chunkSize: number
|
|
totalChunks: number
|
|
receivedChunks: number
|
|
percent: number
|
|
/** uploading / completed */
|
|
status: string
|
|
assetId: number
|
|
url: string
|
|
}
|
|
|
|
/** 断点续传回显:传到第几片、还剩多少(服务端说了算,客户端不自己记账) */
|
|
export const getUploadProgressApi = (uploadId: string) => {
|
|
return request.get<UploadProgress>({ url: `/admin/media/upload/${uploadId}` })
|
|
}
|
|
|
|
export const getMediaApi = (id: number) => {
|
|
return request.get<MediaAsset>({ url: `/admin/media/${id}` })
|
|
}
|