分片上传
目录
本节介绍分片上传的相关功能。
分片上传分为以下三个步骤:
初始化分片。
调用bucket.init_multipart_upload方法返回OSS创建的全局唯一的uploadId。
将文件进行分片,并上传分片。
调用bucket.upload_part方法上传分片数据。
- 对于同一个uploadId,分片号标识了该分片在整个文件内的相对位置。如果使用同一个分片号上传了新的数据,那么OSS上这个分片已有的数据将会被覆盖。
- OSS将收到的分片数据的MD5值放在ETag头内返回给用户。
- OSS计算上传数据的MD5值,并与SDK计算的MD5值比较,如果不一致则返回InvalidDigest错误码。
合并分片。
所有分片上传完成后,调用bucket.complete_multipart_upload方法将所有分片合并成完整的文件。
完整分片上传
以下代码用于分片上传:
import oss
# 设置基本信息
APIKey = '<your_API_key>'
APIKeySecrete = '<your_API_key_secrete>'
EndPoint = 'oss.cn-north-3.inspurcloudoss.com'
BucketName = '<your_bucket_name>'
# <your_object_name>需包含目录及文件名后缀,如:“img/my_photo.png”
ObjectName = '<your_object_name>'
# <your_local_file_path>为绝对路径,需包含文件后缀名,若无此文件则创建新文件。如:“D:/recv/file.txt”
LocalFilePath = '<your_local_file_path>'
# 使用API密钥来获取管理权限,获得方式在控制台右上角用户头像->API密钥
auth = oss.Auth(APIKey, APIKeySecrete)
# 使用密钥, 节点来初始化储存信息,这里以华北三为案例
bucket = oss.Bucket(auth, EndPoint, BucketName)
fileSize = os.path.getsize(UploadFilePath)
# 分片大小可以自由设置,单位byte。这里使用默认值10MB
partSize = oss.part_size
# 初始化分片上传时间并使用upload ID区分
uploadID = bucket.init_multipart_upload(ObjectName).upload_id
part = []
# 逐个上传分片
with open(UploadFilePath, 'rb') as f:
partNum = 1
offset = 0
while offset < fileSize:
num_to_upload = min(partSize, fileSize - offset)
result = bucket.upload_part(ObjectName, uploadID, partNum,
SizedFileAdapter(f, num_to_upload))
part.append(PartInfo(partNum, result.etag))
offset += num_to_upload
partNum += 1
print("Offset = " + str(offset))
# 完成分片上传,合并分片
bucket.complete_multipart_upload(ObjectName, uploadID, part)
中止分片上传
可以调用abort_multipart_upload()来终止分片上传。以下代码用于中止上传:
import oss
# 设置基本信息
APIKey = '<your_API_key>'
APIKeySecrete = '<your_API_key_secrete>'
EndPoint = 'oss.cn-north-3.inspurcloudoss.com'
BucketName = '<your_bucket_name>'
# <your_object_name>需包含目录及文件名后缀,如:“img/my_photo.png”
ObjectName = '<your_object_name>'
# <your_local_file_path>为绝对路径,需包含文件后缀名,若无此文件则创建新文件。如:“D:/recv/file.txt”
LocalFilePath = '<your_local_file_path>'
# 使用API密钥来获取管理权限,获得方式在控制台右上角用户头像->API密钥
auth = oss.Auth(APIKey, APIKeySecrete)
# 使用密钥, 节点来初始化储存信息,这里以华北三为案例
bucket = oss.Bucket(auth, EndPoint, BucketName)
# 调用init_multipart_upload()中获得的upload ID
uploadID = <your_upload_id>
# 中止分片上传
bucket.aborrt_multipart_upload(ObjectName, uploadID)
列举分片上传事件
调用ossClient.getMultipartUploadList(ListMultipartUploadsRequest listMultipartUploadsRequest)方法列举出指定存储桶下所有已经上传成功的分片,参数ListMultipartUploadsRequest 主要包含以下属性:
属性 | 描述 |
---|---|
String bucketName | 存储桶的名字 |
String keyMarker | 所有文件名称的字母序大于keyMarker参数值的分片上传事件。可以与uploadIdMarker参数一同使用来指定返回结果的起始位置。 |
String uploadIdMarker | 与keyMarker参数一同使用来指定返回结果的起始位置。 如果未设置keyMarker参数,则此参数无效。如果设置了keyMarker参数,则查询结果中包含:名称的字母序大于keyMarker参数值的所有文件;文件名称等于keyMarker参数值且uploadId比uploadIdMarker参数值大的所有分片上传事件。 |
String prefix | 限定返回的文件名称必须以指定的prefix作为前缀。注意使用prefix查询时,返回的文件名称中仍会包含prefix。 |
String delimiter | 用于对文件名称进行分组的一个字符。所有名称包含指定的前缀且第一次出现delimiter字符之间的文件作为一组元素。 |
Integer maxUploads | 限定此次返回分片上传事件的最大数目,默认值和最大值均为1000。 |
String encodingType | 限定文件的编码格式,在其他基础上进一步限制返回结果 |
列举全部分片上传事件
默认情况下,listMultipartUploads 只能一次列举1000个分片。当分片数量大于1000时,可以采用以下代码列举全部分片上传事件。
没写
分页列举全部上传事件
以下代码用于分页列举所有上传事件:
没写