如何上传一个新文件(完整流程)?

Viewed 1

我看到上传相关的接口有 osbeginupload、osendupload,还有直接 PUT 到对象存储的步骤,整个流程到底是什么样的?创建新文件和给已有文件生成新版本有什么区别?

1 Answers

AnyShare 的文件上传采用"协议接口 + 对象存储直传"两段式。普通文件(≤5GB)完整流程如下:

第 1 步:开始上传 —— POST /api/efast/v1/file/osbeginupload

请求体(FileOsbeginuploadReq,必填 docidlength):

字段 说明
docid 创建文件时传父目录 gns;**编辑文件(生成新版本)**时传所编辑文件的 gns。
name 创建文件时传文件名;编辑文件时留空。
length 整个文件长度(字节),最大 5GB。
ondup 重名策略(仅 name 不为空时生效),默认 21=抛异常、2=自动改名、3=覆盖。
client_mtime 客户端本地修改时间(微秒)。
editedrev 编辑文件时基于的版本 ID;不为空时会校验是否为服务端最新版本,不一致报 403203

创建文件请求示例:

POST /api/efast/v1/file/osbeginupload HTTP/1.1
Host: 192.168.1.100
Authorization: Bearer <ACCESS_TOKEN>
Content-Type: application/json

{
  "docid": "gns://21A9B9FD1B524CB49D54BF7399F82EB4",
  "name": "file.txt",
  "length": 42,
  "client_mtime": 1380245084296354
}

响应示例:

{
  "authrequest": [
    "PUT",
    "https://s3-ap-northeast-1.amazonaws.com/anyshares3accesstestbucket/21A9B9FD1B524CB49D54BF7399F82EB4/AAA6CBAFE45B4E4D884DC59805E60A5C",
    "Content-Type: application/octet-stream",
    "Date: Tue, 07 Apr 2015 02:35:36 GMT",
    "Authorization: AWS AKIAJEROARV2UTTADY6A:PkLXjvYrDGDVZgTD8WVbMmS33q4="
  ],
  "docid": "gns://21A9B9FD1B524CB49D54BF7399F82EB4/91E6CBAFE45B4E4D884DC59805E60A5C",
  "name": "testfile",
  "rev": "AAA6CBAFE45B4E4D884DC59805E60A5C"
}

第 2 步:向对象存储直传文件内容 —— 客户端在 15 分钟内,按 authrequest 指定的方法、URL、Headers 发起请求,Body 为文件内容:

PUT /anyshares3accesstestbucket/21A9B9FD1B524CB49D54BF7399F82EB4/AAA6CBAFE45B4E4D884DC59805E60A5C HTTP/1.1
Host: s3-ap-northeast-1.amazonaws.com
Content-Type: application/octet-stream
Date: Tue, 07 Apr 2015 02:35:36 GMT
Authorization: AWS AKIAJEROARV2UTTADY6A:PkLXjvYrDGDVZgTD8WVbMmS33q4=
Content-Length: 42

<文件二进制内容>

reqmethodPOST,则改用表单方式上传,阿里云 OSS 和亚马逊 S3 要求 file 必须为表单最后一个域。

第 3 步:结束上传 —— POST /api/efast/v1/file/osendupload

请求体(FileOsenduploadReq,必填 docidrev,均来自第 1 步返回):

POST /api/efast/v1/file/osendupload HTTP/1.1
Host: 192.168.1.100
Authorization: Bearer <ACCESS_TOKEN>
Content-Type: application/json

{
  "docid": "gns://21A9B9FD1B524CB49D54BF7399F82EB4/91E6CBAFE45B4E4D884DC59805E60A5C",
  "rev": "AAA6CBAFE45B4E4D884DC59805E60A5C",
  "md5": "B029C864F8E75AB6CA3BBE6976C9AF27",
  "crc32": "C89E6EA0"
}

响应示例:

{
  "editor": "6019dc28-924e-11e5-94e2-000c29b7abd8",
  "modified": 1380502294452719,
  "name": "testfile"
}

说明: md5 / crc32 / slice_md5 为可选校验值;csflevel 仅在上传定密时设置(5~15 正常密级,0x7FFF 空密级)。若第 2 步直传未在 15 分钟内完成,可调用 POST /api/efast/v1/file/osuploadrefresh 重新获取鉴权请求。