
# 追加写对象
#### 使用场景
简单上传、表单上传、多段上传在上传结束之后内容是固定的，只能读取，不能修改。如果对象内容发生了改变，只能重新上传同名的对象来覆盖之前的内容。
对于上传日志、视频监控和视频直播等领域生成的实时视频流，使用以上上传方式，会存在软件架构复杂、客户端发送请求频繁造成服务器压力大、数据延时等问题。为了解决以上问题，可以使用追加写的方式上传对象，就是在指定桶内的一个对象尾追加上传数据，做到及时可读。当不存在相同对象键值的对象时，则创建新对象。
通过追加上传，可在视频数据产生之后及时将数据上传至同一个对象，而客户端只需要定时获取该对象的长度，并与上次读取的长度进行对比。如果发现有新的可读数据，则触发一次读操作来获取新上传的数据部分即可。通过这种方式可以简化架构，增强扩展性。
![](https://support.huaweicloud.com/usermanual-obs/public_sys-resources/note_3.0-zh-cn.png)
通过追加写方式上传的对象类型为Appendable，通过简单上传（PUT上传）的对象类型为Normal。
#### 约束与限制
- 每次追加上传都会更新该对象的最后修改时间。
- 使用服务端加密SSE-C方式，那么追加上传和初始化段一样，设置诸如x-obs-server-side-encryption之类的请求Header，后续追加上传也必须携带。
- 使用服务端加密SSE-KMS方式，有且只有第一次上传且桶内不存在同名对象时，才设置诸如x-obs-server-side-encryption之类的请求Header，后续追加上传不携带。
- 每次追加上传的长度不能超过对象长度上限5GB的限制。
- 每个Appendable对象追加写次数最多为10000次。
- 不支持通过追加写的方式上传COLD（归档存储）或DEEP_ARCHIVE（深度归档存储）存储类别的对象。
- 如果桶设置了跨区域复制配置，则不能调用该接口。
- 并行文件系统不支持追加写对象。
- 对一个已经存在的Appendable对象进行Put Object操作，那么该Appendable对象会被新Object覆盖，类型变为Normal对象，反之出错。
- Appendable对象复制后变成Normal对象，不支持Appenable对象复制成Appendable对象。
- 追加写对象不支持上传回调操作。
- 在开启了WORM开关的桶中，使用追加写上传对象将失败并返回403。
 
#### 注意事项
- 当文件不存在时，调用AppendObject接口会创建一个追加类型文件。
- 在开启了WORM开关的桶中，使用追加写上传对象将失败并返回403。
- ETag返回的是本次追加上传数据的Hash值，不是整个对象的Hash值。
- 当追加文件已存在时：
  - 如果待追加的文件为追加类型文件，当设置的追加位置和文件当前长度相等，则直接在该文件末尾追加内容；当设置的追加位置和文件当前长度不相等，则抛出PositionNotEqualToLength异常。
  
  - 如果待追加的文件为非追加类型文件时，例如通过简单上传的文件类型为Normal的文件，则抛出ObjectNotAppendable异常。
   
 
#### 前提条件
已[创建桶](https://support.huaweicloud.com/usermanual-obs/zh-cn_topic_0045829088.html#ZH-CN_TOPIC_0000001952642149)。
#### 使用方式
OBS支持通过SDK、API方式追加写对象。
#### 使用API
[对象操作](https://support.huaweicloud.com/api-obs/obs_04_0088.html)
#### 使用SDK
| [Java](https://support.huaweicloud.com/sdk-java-devg-obs/obs_21_0609.html) | [Python](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_0904.html) | [C](https://support.huaweicloud.com/sdk-c-devg-obs/obs_20_0408.html) | [Go](https://support.huaweicloud.com/sdk-go-devg-obs/obs_23_0404.html) | [BrowserJS](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0509.html) | [.NET](https://support.huaweicloud.com/sdk-dotnet-devg-obs/obs_25_0410.html) | [Android](https://support.huaweicloud.com/sdk-android-devg-obs/obs_26_0409.html) | [iOS](https://support.huaweicloud.com/sdk-ios-devg-obs/obs_27_0408.html) | PHP不支持 | [Node.js](https://support.huaweicloud.com/sdk-nodejs-devg-obs/obs_29_0409.html) |
|---|---|---|---|---|---|---|---|---|---|
   
#### 常见问题
**追加写对象有文件类型限制吗？**
没有。追加上传时只识别二进制流，对于文件类型无要求。
**追加写对象是否支持并发场景下的锁机制?**
OBS本身不支持，如果需要避免同一个对象被并行访问，需要在上层应用中增加对象的锁机制。
