/** * 视频号 CDN 上传器(视频 20302 / 封面 20304) * * 三阶段:applyupload → uploadpart×N → completepart * 分片大小 8MB,ETag 用本地 MD5 拼装(服务端 ETag == 分片 MD5 已实测确认) * 支持秒传/续传:同 taskid 已传分片服务端保留,不必重传 * * 数据来源:network-logs.json (8/20) + network-logs1.json (8/19) */ import type { Http } from "../../utils/http"; /** * 上传超时调优参数 * * 上传对网络远比普通接口敏感:8MB 分片在慢网下几十秒才走完一片, * 撞上过短的超时只会触发无意义的重试并把整体时间拖长, * 所以三个阶段统一给 3 分钟的宽松上限。每片独立计时,总时长不设上限。 */ export interface UploadTuning { /** 元数据请求(applyupload)超时 */ metaTimeout?: number; /** 单分片上传超时 */ partTimeout?: number; /** 单分片重试次数(PartNumber + Content-MD5 幂等,重试安全) */ partRetries?: number; /** completepart 超时:服务端要落盘拼装整个文件,大视频天然慢 */ completeTimeout?: number; } export interface UploadOptions { filePath: string; /** filetype: 20302=视频, 20304=封面 */ fileType: number; uin: number; authKey: string; http: Http; logger?: { info: (msg: string) => void; error: (msg: string, ...args: any[]) => void; }; /** 超时调优,不传则用 DEFAULT_TUNING */ tuning?: UploadTuning; } export interface UploadResult { /** completepart 返回的 DownloadURL */ downloadUrl: string; /** 文件 MD5 */ md5: string; fileSize: number; } /** * 上传单个文件到视频号 CDN * * @param opts.filePath 本地文件路径 * @param opts.fileType 20302=视频 / 20304=封面 * @param opts.uin weixinnum * @param opts.authKey Authorization 头 */ export declare function uploadFile(opts: UploadOptions): Promise;