From a682aac1c9a1cc4dc804b172d80901cb48a18ded Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Wed, 13 Apr 2022 17:47:49 +0800 Subject: [PATCH] Fix: COS cannot finish upload --- src/component/Uploader/core/api/index.ts | 18 ++++++++++++++++++ src/component/Uploader/core/errors/index.ts | 13 +++++++++++++ src/component/Uploader/core/uploader/cos.ts | 13 +++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/component/Uploader/core/api/index.ts b/src/component/Uploader/core/api/index.ts index c79ce1d..e01aa60 100644 --- a/src/component/Uploader/core/api/index.ts +++ b/src/component/Uploader/core/api/index.ts @@ -9,6 +9,7 @@ import { } from "../types"; import { OBJtoXML, request, requestAPI } from "../utils"; import { + COSUploadCallbackError, COSUploadError, CreateUploadSessionError, DeleteUploadSessionError, @@ -370,6 +371,23 @@ export async function cosFormUploadChunk( return res.data; } +export async function cosUploadCallback( + sessionID: string, + cancel: CancelToken +): Promise { + const res = await requestAPI(`callback/cos/${sessionID}`, { + method: "get", + data: "{}", + cancelToken: cancel, + }); + + if (res.data.code != 0) { + throw new COSUploadCallbackError(res.data); + } + + return res.data.data; +} + export async function upyunFormUploadChunk( url: string, file: File, diff --git a/src/component/Uploader/core/errors/index.ts b/src/component/Uploader/core/errors/index.ts index cab8708..0b63c64 100644 --- a/src/component/Uploader/core/errors/index.ts +++ b/src/component/Uploader/core/errors/index.ts @@ -28,6 +28,7 @@ export enum UploaderErrorName { FailedFinishOneDriveUpload = "FailedFinishOneDriveUpload", S3LikeChunkUploadFailed = "S3LikeChunkUploadFailed", S3LikeUploadCallbackFailed = "S3LikeUploadCallbackFailed", + COSUploadCallbackFailed = "COSUploadCallbackFailed", COSPostUploadFailed = "COSPostUploadFailed", UpyunPostUploadFailed = "UpyunPostUploadFailed", QiniuChunkUploadFailed = "QiniuChunkUploadFailed", @@ -316,6 +317,18 @@ export class COSUploadError extends UploaderError { } } +// COS 无法完成上传回调 +export class COSUploadCallbackError extends APIError { + constructor(response: Response) { + super(UploaderErrorName.COSUploadCallbackFailed, "", response); + } + + public Message(i18n: string): string { + this.message = `无法完成文件上传`; + return super.Message(i18n); + } +} + // Upyun 上传失败 export class UpyunUploadError extends UploaderError { constructor(public response: UpyunError) { diff --git a/src/component/Uploader/core/uploader/cos.ts b/src/component/Uploader/core/uploader/cos.ts index 403fa84..46fedf6 100644 --- a/src/component/Uploader/core/uploader/cos.ts +++ b/src/component/Uploader/core/uploader/cos.ts @@ -1,5 +1,5 @@ -import Base from "./base"; -import { cosFormUploadChunk } from "../api"; +import Base, { Status } from "./base"; +import { cosFormUploadChunk, cosUploadCallback } from "../api"; export default class COS extends Base { public upload = async () => { @@ -22,4 +22,13 @@ export default class COS extends Base { this.cancelToken.token ); }; + + protected async afterUpload(): Promise { + this.transit(Status.finishing); + this.logger.info(`Sending COS upload callback...`); + return cosUploadCallback( + this.task.session!.sessionID, + this.cancelToken.token + ); + } }