我要上传几个 G 的大文件,普通上传肯定不行。AnyShare 的分片上传流程是怎样的?分片大小有什么限制?每片上传完怎么合并?
大文件采用分片上传,由 osinitmultiupload → osuploadpart(循环)→ oscompleteupload 三步组成。开始前建议先调用 POST /api/efast/v1/file/osoption 获取分片约束:
{
"partminsize": 204800,
"partmaxsize": 5368709120,
"partmaxnum": 10000
}
含义:除最后一片外,每片最小 partminsize、最大 partmaxsize,最多 partmaxnum 片。注意亚马逊 S3 限定分片不小于 5MB,七牛存储限定分片大小为 4MB 的倍数。
第 1 步:初始化分片上传 —— POST /api/efast/v1/file/osinitmultiupload
请求体与 osbeginupload 类似(docid、length 必填,创建文件传 name、编辑文件不传),返回用于后续分片的 uploadid 与 rev。
第 2 步:逐片上传 —— POST /api/efast/v1/file/osuploadpart
每次请求返回该片对应的 authrequest(PUT 方法、URL 含 partNumber 与 uploadId、Headers)。客户端在 15 分钟内 PUT 分片内容到对象存储,并从对象存储响应头中取 ETag(注意 header key 大小写可能为 ETag/etag/Etag 等,建议统一转小写比对)。
第 3 步:完成合并 —— POST /api/efast/v1/file/oscompleteupload
请求体(FileOscompleteuploadReq,必填 docid、rev、uploadid、partinfo),partinfo 为"分块号 → [ETag, 分片大小]"的映射:
{
"docid": "gns://21A9B9FD1B524CB49D54BF7399F82EB4/91E6CBAFE45B4E4D884DC59805E60A5C",
"rev": "AAA6CBAFE45B4E4D884DC59805E60A5C",
"uploadid": "0004B9895DBBB6EC98E36",
"partinfo": {
"1": ["3349DC700140D7F86A078484278075A9", 4194304],
"2": ["22222C700140D7F86A078484278075A9", 1235]
}
}
该接口返回 multipart/form-data,其中 JSON 部分含 authrequest([0] 方法、[1] URL、[2] 及之后为 Headers),客户端需在 15 分钟内将返回 body 中 XML 部分按指定 Headers PUT 到对象存储,完成最终合并。