Skip to content
大纲

AppendObject

接口描述

AppendObject以追加写的方式上传文件。通过AppendObject操作创建的Object类型为Appendable Object,可以对该Object追加数据;而通过PutObject上传的Object是Normal Object,不可进行数据追加写。

说明:

  • Appendable Object大小限制为0~5GB
  • AppendObject接口在进行追加写时要求对该Object有写权限

请求(Request)

请求语法

首次上传AppendObject 时,使用如下方法:

POST /<BucketName>/<ObjectName>?append HTTP/1.1
Host: fos.flymeyun.com
Date: <GMT Date>
Content-Type: text/plain
Content-Length: <ContentLength>

说明:

  • 如该Object不存在,则创建一个Appendable的Object。
  • 如已存在同名的Object,则上传的数据会覆盖原有的Object,无论原有Object是否为Appendable,均创建新的Appendable Object。
  • 允许创建或者覆盖一个长度为0的Object。

如已上传了部分AppendObject,需要进行断点续传时,使用如下方法:

POST /<BucketName>/<ObjectName>?append&offset=<OffsetSize> HTTP/1.1
Host: fos.flymeyun.com
Date: <GMT Date>
Content-Type: text/plain
Content-Length: <ContentLength>

说明:

  • 如要续传的Object不存在时,会返回错误码404 NoSuchKey。
  • 如要续传的Object并不是Appendable的,则会返回403 ObjectUnappendable。
  • 如值错误,则返回409 OffsetIncorrect。
  • 如果不指定offset会直接覆盖而不是默认追加在末尾

请求头域

名称类型描述是否必须
Cache-ControlString浏览器cache的一种机制设置
Content-DispositionString指示浏览器如何显示附加的文件
Content-MD5StringRFC2616定义的HTTP请求内容的MD5摘要,可以通过携带该字段来验证保存在FOS侧的文件和用户预期的文件是否一致。
ExpiresStringGMT时间,缓存失效时间
x-fos-meta-*String用户自定义的meta
x-fos-content-sha256String指本次所传数据的sha256值,必须与此匹配,否则AppendObject失败
x-fos-content-crc32String本次上传object增量数据的CRC值(循环冗余校验码)。

请求参数

名称类型参数位置描述是否必须
append-Query参数代表对Appendable Object进行追加操作
offset-Query参数代表数据断点,即从该点后继续追加,取值为已实际上传的数据大小

响应(Response)

响应头域

名称类型描述是否必须
Content-MD5String当前已成功上传的整个object的MD5值
x-fos-next-append-offsetLong Int指明下次AppendObject请求时传入的OffsetSize的值。如果不使用续传方式,即请求起始行没有offset,则这个值是0
x-fos-content-crc32String整个object数据的CRC值(循环冗余校验码)。
ETagStringAppend后整个Object的ETag值

响应参数

使用细节说明 对于Appendable的Object:

  • 支持AppendObject。
  • 支持RenameObject。
  • 对一个已存在的Appendable的Object执行PutObject,则Appendable的Object会被覆盖变成普通Object。
  • 对一个已存在的Appendable的Object,在<OffsetSize>值正确的情况下,追加一个长度为0的内容,不会改变Object的任何状态。
  • 不建议并发操作同一个Object,如一个线程执行AppendObject,另一线程执行PutObject/CopyObjcect/DeleteObject等操作,可能会导致操作结果错误或操作失败。
  • 如果对同一个Object做多线程或者多进程的并发追加,有可能因为并发过程的不确定性,返回409 OffsetIncorrect失败。

对其他接口的影响

对于GetObjectMeta接口,当一个Object是Appendable时,返回的结果中会多如下两个字段:

名称类型描述是否必须
x-fos-next-append-offsetString当Object是由AppendObject接口创建的,会返回该字段,指明下次AppendObject时请求传入的OffsetSize的值。如果此时Object的大小是5G,offset依然返回5G
x-fos-object-typeString当Object的类型值。当object是由AppendObject创建的,返回的值为Appendable,其他情况暂不返回

关于用户自定义的x-fos-meta-*

  • 在首次创建AppendableObject(即Http请求起始行不带offset参数)时,携带的x-fos-meta-* Header会被存储,后续追加AppendObject(即Http请求起始行携带offset参数)时的x-fos-meta- *Header则默认被忽略。
  • 由于Appendable Object支持CopyObject,因此可以使用CopyObject自我拷贝以覆盖的形式来修改x-fos-meta-* Header的值。

数据校验

  • 每次调用AppendObject的时候,如您上传MD5或者Sha256值,FOS会对该次调用上传的数据进行校验。
  • 每次数据追加结束,会返回已上传的整个Object的MD5值。

示例

请求示例一

POST /BucketName/ObjectName?append  HTTP/1.1
Host: fos.flymeyun.com
Date: Wed, 06 Apr 2016 06:34:40 GMT
Content-Type: text/plain
Content-Length: 1134

[1134 bytes of object data]

响应示例一

HTTP/1.1 200 OK
x-fos-request-id: c31b374e-048a-41f0-9a9a-31bc4bc57509
Date: Wed, 06 Apr 2016 06:34:40 GMT
ETag: "7c935a3947e3a684333480bd6b58b7c2"
Content-Length: 0
Content-MD5: RJBidEhsrgCKeDjvQjrF8A==
x-fos-next-append-offset: 1134
Connection: close

请求示例二

POST /BucketName/ObjectName?append&offset=1134 HTTP/1.1
Host: fos.flymeyun.com
Date: Wed, 06 Apr 2016 06:34:40 GMT
Content-Type: text/plain
Content-Length: 1900

[1900 bytes of object data]

响应示例二

HTTP/1.1 200 OK
x-fos-request-id: 28a99102-d0a5-4252-a4ed-fa6dc801806b
Date: Wed, 06 Apr 2016 06:34:40 GMT
ETag: "11257f81dce31a95f67f6e75018b77e3"
Content-Length: 0
Content-MD5: fJNaOUfjpoQzNIC9a1i3wg==
x-fos-next-append-offset: 3034