如何上传大文件(分片上传流程)?

Viewed 1

我要上传几个 G 的大文件,普通上传肯定不行。AnyShare 的分片上传流程是怎样的?分片大小有什么限制?每片上传完怎么合并?

1 Answers

大文件采用分片上传,由 osinitmultiuploadosuploadpart(循环)→ 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 类似(docidlength 必填,创建文件传 name、编辑文件不传),返回用于后续分片的 uploadidrev

第 2 步:逐片上传 —— POST /api/efast/v1/file/osuploadpart

每次请求返回该片对应的 authrequest(PUT 方法、URL 含 partNumberuploadId、Headers)。客户端在 15 分钟内 PUT 分片内容到对象存储,并从对象存储响应头中取 ETag(注意 header key 大小写可能为 ETag/etag/Etag 等,建议统一转小写比对)。

第 3 步:完成合并 —— POST /api/efast/v1/file/oscompleteupload

请求体(FileOscompleteuploadReq,必填 docidrevuploadidpartinfo),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 到对象存储,完成最终合并。