parallel-file-uploader
Version:
高性能并行文件上传工具,支持大文件分片上传、断点续传、Web Worker多线程处理
251 lines • 7.68 kB
TypeScript
/**
* 全局响应接口
* 统一的API响应格式
*/
export interface ResGlobalInterface<T> {
/** 请求是否成功 */
isSuccess: boolean;
/** 响应数据 */
data: T;
/** 错误或提示消息 */
message?: string;
/** 响应状态码 */
code?: number;
}
/**
* 文件上传状态枚举
*/
export declare enum UploadStepEnum {
/** 上传前准备阶段 */
beforeUpload = "beforeUpload",
/** 正在上传 */
upload = "upload",
/** 上传完成 */
complete = "complete",
/** 上传错误 */
error = "error",
/** 上传暂停 */
pause = "pause",
/** 等待上传 */
waiting = "waiting"
}
/**
* 分片状态枚举
*/
export declare enum ChunkStatusEnum {
/** 等待上传 */
waiting = "waiting",
/** 正在上传 */
uploading = "uploading",
/** 上传成功 */
success = "success",
/** 上传错误 */
error = "error",
/** 上传暂停 */
pause = "pause"
}
/**
* 文件分片信息接口
* 用于断点续传时记录已上传的分片
*/
export interface FilePartInfo {
/** 分片的ETag标识 */
etag: string;
/** 分片编号,从1开始 */
partNumber: number;
/** 分片大小(字节) */
partSize?: number;
/** 最后修改时间 */
lastModified?: number;
}
/**
* 分片信息接口
* 包含分片的所有相关信息
*/
export interface ChunkInfo {
/** 分片文件对象 */
file?: File;
/** 在原文件中的起始位置 */
start: number;
/** 在原文件中的结束位置 */
end: number;
/** 分片编号,从1开始 */
partNumber: number;
/** 重试次数 */
retryCount?: number;
/** 上传耗时(毫秒) */
uploadTime?: number;
/** 分片大小(字节) */
partSize?: number | any;
/** 分片状态 */
status?: ChunkStatusEnum;
}
/**
* 文件信息接口
* 包含文件的所有相关信息和上传状态
*/
export interface FileInfo {
/** 文件唯一标识符 */
fileId: string;
/** 文件名 */
fileName: string;
/** 文件大小(字节) */
fileSize: number;
/** 已上传大小(字节) */
uploadedSize: number;
/** 上传进度百分比 (0-100) */
progress: number;
/** 文件上传状态 */
status: UploadStepEnum;
/** 原始文件对象 */
file: File;
/** 错误消息 */
errorMessage?: string;
/** 最后更新时间戳 */
lastUpdated?: number;
/** 文件MIME类型 */
mimeType?: string;
/** 总分片数量 */
totalChunks?: number;
/** 上传相关信息 */
uploadInfo?: {
/** 已上传的分片列表 */
parts?: Array<FilePartInfo>;
/** 文件MD5值 */
md5?: string;
/** 其他扩展字段 */
[key: string]: any;
};
/** 自定义上传数据 */
uploadData?: any;
}
/**
* 并行文件上传器配置选项
*/
export interface ParallelFileUploaderOptions {
/** 最大并发上传文件数,默认3 */
maxConcurrentFiles?: number;
/** 每个文件最大并发分片数,默认3 */
maxConcurrentChunks?: number;
/** 分片大小(字节),默认5MB */
chunkSize?: number;
/** 最大重试次数,默认3 */
maxRetries?: number;
/** 最大文件大小限制(字节) */
maxFileSize?: number;
/**
* 🔧 允许的文件类型列表,支持MIME类型和扩展名
* 支持 "*" 通配符表示允许所有文件类型
* @example ['image/*', '.pdf', 'application/json', '*']
*/
allowedFileTypes?: string[];
/** 分片上传URL(已废弃,建议使用sendFilePartToServer) */
uploadPartUrl?: string;
/** 重试延迟时间(毫秒),默认1000 */
retryDelay?: number;
/** 是否自动开始上传,默认true */
autoStart?: boolean;
/** 是否启用调试模式,默认false */
debugMode?: boolean;
/** 是否启用速度限制,默认false */
enableSpeedLimit?: boolean;
/** 最大上传速度(字节/秒),0表示不限制 */
maxUploadSpeed?: number;
/** 是否启用性能监控,默认false */
enablePerformanceMonitor?: boolean;
/** 是否启用队列持久化,默认false */
enableQueuePersistence?: boolean;
/** 持久化存储的键名,默认'parallel-uploader-queue' */
persistenceKey?: string;
/** 文件添加到队列时的回调 */
onFileAdded?: (fileInfo: FileInfo) => void;
/** 文件上传进度更新时的回调 */
onFileProgress?: (fileInfo: FileInfo) => void;
/** 文件上传成功时的回调 */
onFileSuccess?: (params: {
fileInfo: FileInfo;
data: any;
}) => void;
/** 文件上传失败时的回调 */
onFileError?: (fileInfo: FileInfo, error: Error) => void;
/** 文件上传完成时的回调(无论成功失败) */
onFileComplete?: (params: {
fileInfo: FileInfo;
data: any;
}) => void;
/** 所有文件上传完成时的回调 */
onAllComplete?: () => void;
/** 文件被拒绝时的回调(如文件类型不匹配、大小超限等) */
onFileRejected?: (file: File, reason: string) => void;
/** 性能监控数据更新时的回调 */
onPerformanceUpdate?: (data: any) => void;
/** 初始化文件上传,向服务器发送文件信息 */
sendFileInfoToServer?: (fileInfo: FileInfo) => Promise<ResGlobalInterface<any>>;
/** 上传文件分片到服务器 */
sendFilePartToServer?: (fileInfo: FileInfo, chunkInfo: ChunkInfo) => Promise<ResGlobalInterface<any>>;
/** 通知服务器文件上传完成,进行文件合并 */
sendFileCompleteToServer?: (fileInfo: FileInfo) => Promise<ResGlobalInterface<any>>;
/** 从服务器获取已上传的分片信息(用于断点续传) */
getFilePartsFromServer?: (fileInfo: FileInfo) => Promise<ResGlobalInterface<FilePartInfo[]>>;
/** 通知服务器暂停上传 */
sendPauseToServer?: (fileInfo: FileInfo) => Promise<ResGlobalInterface<any>>;
}
/**
* Worker消息接口
* 用于主线程与Worker之间的通信
*/
export interface WorkerMessage {
/** 消息类型 */
type: 'data' | 'response' | 'error' | 'ready' | 'abort';
/** 文件ID */
fileId?: string;
/** 分片信息 */
chunkInfo?: ChunkInfo;
/** 分片数据 */
chunk?: Blob | ArrayBuffer;
/** 上传URL(已废弃) */
uploadUrl?: string;
/** 处理结果 */
result?: any;
/** 错误信息 */
error?: string;
/** 是否已处理标记 */
processed?: boolean;
}
/**
* 上传器错误类型枚举
*/
export declare enum ErrorType {
/** 网络错误 */
NETWORK = "NETWORK",
/** 文件过大错误 */
FILE_TOO_LARGE = "FILE_TOO_LARGE",
/** 文件类型不允许错误 */
FILE_TYPE_NOT_ALLOWED = "FILE_TYPE_NOT_ALLOWED",
/** 服务器错误 */
SERVER_ERROR = "SERVER_ERROR",
/** 分片上传失败错误 */
CHUNK_UPLOAD_FAILED = "CHUNK_UPLOAD_FAILED",
/** 文件初始化失败错误 */
FILE_INITIALIZATION_FAILED = "FILE_INITIALIZATION_FAILED",
/** 未知错误 */
UNKNOWN = "UNKNOWN"
}
/**
* 自定义错误类
* 提供详细的错误信息和类型分类
*/
export declare class UploaderError extends Error {
/** 错误类型 */
type: ErrorType;
/** 相关的文件信息 */
fileInfo?: FileInfo;
/**
* 构造函数
* @param message 错误消息
* @param type 错误类型
* @param fileInfo 相关的文件信息
*/
constructor(message: string, type: ErrorType, fileInfo?: FileInfo);
}
//# sourceMappingURL=type.d.ts.map