全部产品
Search
文档中心

对象存储 OSS:Python追加上传

更新时间:Dec 20, 2023

追加上传是指通过AppendObject方法在已上传的追加类型文件(Appendable Object)末尾直接追加内容。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化

  • 要追加上传,您必须有oss:PutObject权限。具体操作,请参见为RAM用户授权自定义的权限策略

  • 当文件不存在时,调用AppendObject接口会创建一个追加类型文件。

  • 当文件已存在时:

    • 如果文件为追加类型文件,且设置的追加位置和文件当前长度相等,则直接在该文件末尾追加内容。

    • 如果文件为追加类型文件,但是设置的追加位置和文件当前长度不相等,则抛出PositionNotEqualToLength异常。

    • 如果文件为非追加类型文件时,例如通过简单上传的文件类型为Normal的文件,则抛出ObjectNotAppendable异常。

示例代码

以下代码用于追加上传文件:

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 如需在追加上传时设置相关Headers,请参考如下示例代码。
# headers = dict()
# 指定该Object的网页缓存行为。
# headers['Cache-Control'] = 'no-cache'
# 指定该Object被下载时的名称。
# headers['Content-Disposition'] = 'oss_MultipartUpload.txt'
# 指定该Object的内容编码格式。
# headers['Content-Encoding'] = 'utf-8'
# 该请求头用于检查消息内容是否与发送时一致。
# headers['Content-MD5'] = 'ohhnqLBJFiKkPSBO1eNaUA=='
# 指定过期日期。
# headers['Expires'] = 'Wed, 08 Jul 2022 16:57:01 GMT'
# 指定Object的访问权限ACL。此处指定为OBJECT_ACL_PRIVATE,表示私有访问权限。
# headers['x-oss-object-acl'] = oss2.OBJECT_ACL_PRIVATE
# 指定追加上传时是否覆盖同名Object。
# headers['x-oss-forbid-overwrite'] = 'true'
# 指定服务器端加密方式。此处指定为OSS完全托管密钥进行加密(SSE-OSS)。
# headers[OSS_SERVER_SIDE_ENCRYPTION] = SERVER_SIDE_ENCRYPTION_AES256
# 指定Object的存储类型。
# headers['x-oss-storage-class'] = oss2.BUCKET_STORAGE_CLASS_STANDARD
# 创建AppendObject时可以添加x-oss-meta-*,继续追加时不可以携带此参数。如果配置以x-oss-meta-*为前缀的参数,则该参数视为元数据。
# headers['x-oss-meta-author'] = 'Alice'
# result = bucket.append_object(exampledir/exampleobject.txt, 0, 'content of first append', headers=headers)

# 设置首次上传的追加位置(Position参数)为0。
# 填写不能包含Bucket名称在内的Object完整路径,例如exampledir/exampleobject.txt。
result = bucket.append_object('exampledir/exampleobject.txt', 0, 'content of first append')
# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,获取追加位置。
bucket.append_object('<yourObjectName>', result.next_position, 'content of second append')        

相关文档

  • 关于追加上传的完整示例代码,请参见GitHub示例

  • 关于追加上传的API接口说明,请参见AppendObject