diff --git a/apps/ops-web/src/lib/desktop-client-releases.ts b/apps/ops-web/src/lib/desktop-client-releases.ts index 22acd4e..7d76117 100644 --- a/apps/ops-web/src/lib/desktop-client-releases.ts +++ b/apps/ops-web/src/lib/desktop-client-releases.ts @@ -85,6 +85,8 @@ const DESKTOP_CLIENT_RELEASE_COMPLETE_TIMEOUT_MS = 10 * 60 * 1000 const DESKTOP_CLIENT_RELEASE_CHUNK_SIZE_BYTES = 16 * 1024 * 1024 const DESKTOP_CLIENT_RELEASE_HASH_CHUNK_SIZE_BYTES = 8 * 1024 * 1024 const DESKTOP_CLIENT_RELEASE_CHUNK_RETRIES = 2 +const DIRECT_UPLOAD_NOT_FOUND_ERROR_CODE = 40078 +const DIRECT_UPLOAD_NOT_FOUND_ERROR_MESSAGE = 'direct_upload_not_found' export interface DesktopClientReleaseUploadProgress { loaded: number @@ -199,6 +201,7 @@ export const desktopClientReleaseApi = { total: file.size, percent: 0, stage: 'uploading', + message: '直传未完成,已切换为后端分片上传', }) return uploadOSSInChunks(file, target) } @@ -330,7 +333,11 @@ async function completeDirectUpload( } function isDirectUploadNotFoundError(error: unknown): boolean { - return error instanceof OpsApiError && error.code === 40078 + return ( + error instanceof OpsApiError && + (error.code === DIRECT_UPLOAD_NOT_FOUND_ERROR_CODE || + error.message === DIRECT_UPLOAD_NOT_FOUND_ERROR_MESSAGE) + ) } function directUploadHeaders(headers: Record | undefined): Record { @@ -342,6 +349,7 @@ function directUploadHeaders(headers: Record | undefined): Recor function shouldFallbackToChunkedUpload(error: unknown): boolean { if (axios.isAxiosError(error)) return true + if (isDirectUploadNotFoundError(error)) return true return error instanceof Error && error.message === 'missing_direct_upload_url' } @@ -377,6 +385,10 @@ async function pollCompleteJob( if (job.status === 'failed') { throw new OpsApiError({ message: job.error_code || 'desktop_client_release_upload_failed', + code: + job.error_code === DIRECT_UPLOAD_NOT_FOUND_ERROR_MESSAGE + ? DIRECT_UPLOAD_NOT_FOUND_ERROR_CODE + : undefined, detail: job.error || job.message || '上传确认失败', }) }