分片上传

目录

完整分片上传

中止分片上传

列举分片上传事件

本节介绍分片上传的相关功能。

分片上传分为以下三个步骤:

  • 初始化分片。

    调用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
            import os

            # 设置基本信息
            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(LocalFilePath)

            # 分片大小可以自由设置,单位byte。这里使用默认值10MB
            partSize = oss.part_size

            # 初始化分片上传时间并使用upload ID区分
            uploadID = bucket.init_multipart_upload(ObjectName).upload_id
            part = []

            # 逐个上传分片
            with open(LocalFilePath, '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>'

            # 使用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时,可以采用以下代码列举全部分片上传事件。

            没写
  • 分页列举全部上传事件

    以下代码用于分页列举所有上传事件:

            没写