import { apiBase } from './api'; import { compressImageFileIfNeeded, DEFAULT_OSS_MAX_UPLOAD_BYTES, formatOssMaxSizeMb, } from '@dukang/shared-ui/compressImage'; export type OssMediaType = 'IMAGE' | 'VIDEO' | 'FILE'; export type UploadFileResult = { url: string; ossKey: string; bucket: string; mock: boolean; }; /** 经 API 服务端转存 OSS */ export async function uploadFileToOss( file: File, options: { bizType: string; mediaType?: OssMediaType }, ): Promise { const mediaType = options.mediaType ?? (file.type.startsWith('video/') ? 'VIDEO' : 'IMAGE'); let prepared = file; if (mediaType === 'IMAGE') { prepared = await compressImageFileIfNeeded(file); if (prepared.size > DEFAULT_OSS_MAX_UPLOAD_BYTES) { throw new Error(`图片压缩后仍超过 ${formatOssMaxSizeMb()}MB,请换一张较小的图片`); } } const formData = new FormData(); formData.append('file', prepared); formData.append('bizType', options.bizType); formData.append('mediaType', mediaType); const headers: Record = { 'X-Client-App': 'USER_H5', }; const token = localStorage.getItem('accessToken'); if (token) headers.Authorization = `Bearer ${token}`; const res = await fetch(`${apiBase}/common/resources/upload`, { method: 'POST', headers, body: formData, }); const json = await res.json(); if (json.code !== 0) throw new Error(json.message || '上传失败'); return json.data as UploadFileResult; }