mirror of
https://github.com/cloudreve/frontend.git
synced 2025-12-26 04:02:47 +00:00
Feat: send chunk uploading request to slave server
This commit is contained in:
parent
98dba63496
commit
eb3f32922a
|
|
@ -4,6 +4,7 @@ import {
|
|||
CreateUploadSessionError,
|
||||
DeleteUploadSessionError,
|
||||
LocalChunkUploadError,
|
||||
SlaveChunkUploadError,
|
||||
} from "../errors";
|
||||
import { ChunkInfo } from "../uploader/chunk";
|
||||
import { Progress } from "../uploader/base";
|
||||
|
|
@ -38,7 +39,7 @@ export async function deleteUploadSession(id: string): Promise<any> {
|
|||
return res.data.data;
|
||||
}
|
||||
|
||||
export async function loadUploadChunk(
|
||||
export async function localUploadChunk(
|
||||
sessionID: string,
|
||||
chunk: ChunkInfo,
|
||||
onProgress: (p: Progress) => void,
|
||||
|
|
@ -66,3 +67,34 @@ export async function loadUploadChunk(
|
|||
|
||||
return res.data.data;
|
||||
}
|
||||
|
||||
export async function slaveUploadChunk(
|
||||
url: string,
|
||||
credential: string,
|
||||
chunk: ChunkInfo,
|
||||
onProgress: (p: Progress) => void,
|
||||
cancel: CancelToken
|
||||
): Promise<any> {
|
||||
const res = await requestAPI<any>(`${url}?chunk=${chunk.index}`, {
|
||||
method: "post",
|
||||
headers: {
|
||||
"content-type": "application/octet-stream",
|
||||
Authorization: credential,
|
||||
},
|
||||
data: chunk.chunk,
|
||||
onUploadProgress: (progressEvent) => {
|
||||
onProgress({
|
||||
loaded: progressEvent.loaded,
|
||||
total: progressEvent.total,
|
||||
});
|
||||
},
|
||||
cancelToken: cancel,
|
||||
withCredentials: false,
|
||||
});
|
||||
|
||||
if (res.data.code !== 0) {
|
||||
throw new SlaveChunkUploadError(res.data, chunk.index);
|
||||
}
|
||||
|
||||
return res.data.data;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ export enum UploaderErrorName {
|
|||
FailedDeleteUploadSession = "FailedDeleteUploadSession",
|
||||
HTTPRequestFailed = "HTTPRequestFailed",
|
||||
LocalChunkUploadFailed = "LocalChunkUploadFailed",
|
||||
SlaveChunkUploadFailed = "SlaveChunkUploadFailed",
|
||||
WriteCtxFailed = "WriteCtxFailed",
|
||||
RemoveCtxFailed = "RemoveCtxFailed",
|
||||
ReadCtxFailed = "ReadCtxFailed",
|
||||
|
|
@ -21,6 +22,7 @@ const RETRY_ERROR_LIST = [
|
|||
UploaderErrorName.FailedCreateUploadSession,
|
||||
UploaderErrorName.HTTPRequestFailed,
|
||||
UploaderErrorName.LocalChunkUploadFailed,
|
||||
UploaderErrorName.SlaveChunkUploadFailed,
|
||||
UploaderErrorName.RequestCanceled,
|
||||
];
|
||||
|
||||
|
|
@ -142,7 +144,7 @@ export class HTTPError extends UploaderError {
|
|||
}
|
||||
}
|
||||
|
||||
// 无法创建上传会话
|
||||
// 本地分块上传失败
|
||||
export class LocalChunkUploadError extends APIError {
|
||||
constructor(response: Response<any>, protected chunkIndex: number) {
|
||||
super(UploaderErrorName.LocalChunkUploadFailed, "", response);
|
||||
|
|
@ -160,3 +162,15 @@ export class RequestCanceledError extends UploaderError {
|
|||
super(UploaderErrorName.RequestCanceled, "Request canceled");
|
||||
}
|
||||
}
|
||||
|
||||
// 从机分块上传失败
|
||||
export class SlaveChunkUploadError extends APIError {
|
||||
constructor(response: Response<any>, protected chunkIndex: number) {
|
||||
super(UploaderErrorName.SlaveChunkUploadFailed, "", response);
|
||||
}
|
||||
|
||||
public Message(i18n: string): string {
|
||||
this.message = `分片 [${this.chunkIndex}] 上传失败`;
|
||||
return super.Message(i18n);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,4 +54,6 @@ export interface UploadCredential {
|
|||
sessionID: string;
|
||||
expires: number;
|
||||
chunkSize: number;
|
||||
uploadURLs: string[];
|
||||
credential: string;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import Chunk, { ChunkInfo } from "./chunk";
|
||||
import { loadUploadChunk } from "../api";
|
||||
import { localUploadChunk } from "../api";
|
||||
|
||||
export default class Local extends Chunk {
|
||||
protected async uploadChunk(chunkInfo: ChunkInfo) {
|
||||
return loadUploadChunk(
|
||||
return localUploadChunk(
|
||||
this.task.session?.sessionID!,
|
||||
chunkInfo,
|
||||
(p) => {
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
import Chunk, { ChunkInfo } from "./chunk";
|
||||
import { loadUploadChunk } from "../api";
|
||||
import { slaveUploadChunk } from "../api";
|
||||
|
||||
export default class Remote extends Chunk {
|
||||
protected async uploadChunk(chunkInfo: ChunkInfo) {
|
||||
return loadUploadChunk(
|
||||
this.task.session?.sessionID!,
|
||||
return slaveUploadChunk(
|
||||
`${this.task.session?.uploadURLs[0]!}`,
|
||||
this.task.session?.credential!,
|
||||
chunkInfo,
|
||||
(p) => {
|
||||
this.updateChunkProgress(p.loaded, chunkInfo.index);
|
||||
|
|
|
|||
Loading…
Reference in New Issue