OSS提供的分片上傳(Multipart Upload)功能,將要上傳的較大文件(Object)分成多個數據塊(Part)來分別上傳,上傳完成后再調用CompleteMultipartUpload接口將這些Part組合成一個Object來達到斷點續傳的效果。
分片上傳流程
python讀取html文件、分片上傳(Multipart Upload)分為以下三個步驟:
初始化一個分片上傳事件。
調用bucket.init_multipart_upload方法返回OSS創建的全局唯一的uploadId。
python中自定義模塊的導入方法?上傳分片。
調用bucket.upload_part方法上傳分片數據。
說明
python列表分片。對于同一個uploadId,分片號(partNumber)標識了該分片在整個文件內的相對位置。如果使用同一個分片號上傳了新的數據,那么OSS上這個分片已有的數據將會被覆蓋。
OSS將收到的分片數據的MD5值放在ETag頭內返回給用戶。
OSS計算上傳數據的MD5值,并與SDK計算的MD5值比較,如果不一致則返回InvalidDigest錯誤碼。
csv文件python,完成分片上傳。
所有分片上傳完成后,調用bucket.complete_multipart_upload方法將所有分片合并成完整的文件。
分片上傳完整示例
以下通過一個完整的示例對分片上傳的流程進行逐步解析:
# -*- coding: utf-8 -*-
import os
from oss2 import SizedFileAdapter, determine_part_size
from oss2.models import PartInfo
import oss2
# 阿里云主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創建RAM賬號。
auth = oss2.Auth('', '')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '')
key = ''
filename = ''
total_size = os.path.getsize(filename)
# determine_part_size方法用于確定分片大小。
part_size = determine_part_size(total_size, preferred_size=100 * 1024)
# 初始化分片。
# 如需在初始化分片時設置文件存儲類型,請在init_multipart_upload中設置相關headers,參考如下。
# headers = dict()
# headers["x-oss-storage-class"] = "Standard"
# upload_id = bucket.init_multipart_upload(key, headers=headers).upload_id
upload_id = bucket.init_multipart_upload(key).upload_id
parts = []
# 逐個上傳分片。
with open(filename, 'rb') as fileobj:
part_number = 1
offset = 0
while offset < total_size:
num_to_upload = min(part_size, total_size - offset)
# 調用SizedFileAdapter(fileobj, size)方法會生成一個新的文件對象,重新計算起始追加位置。
result = bucket.upload_part(key, upload_id, part_number,
SizedFileAdapter(fileobj, num_to_upload))
parts.append(PartInfo(part_number, result.etag))
offset += num_to_upload
part_number += 1
# 完成分片上傳。
# 如需在完成分片上傳時設置文件訪問權限ACL,請在complete_multipart_upload函數中設置相關headers,參考如下。
# headers = dict()
# headers["x-oss-object-acl"] = oss2.OBJECT_ACL_PRIVATE
# bucket.complete_multipart_upload(key, upload_id, parts, headers=headers)
bucket.complete_multipart_upload(key, upload_id, parts)
# 驗證分片上傳。
with open(filename, 'rb') as fileobj:
assert bucket.get_object(key).read() == fileobj.read()
說明 網絡情況較好時,建議增大分片大小。反之,減小分片大小。
取消分片上傳事件
您可以調用bucket.abort_multipart_upload方法來取消分片上傳事件。當一個分片上傳事件被取消后,無法再使用此uploadId做任何操作,已經上傳的分片數據會被刪除。
以下代碼用于取消分片上傳事件:
# -*- coding: utf-8 -*-
import os
import oss2
# 阿里云主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創建RAM賬號。
auth = oss2.Auth('', '')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '')
key = ''
# 由init_multipart_upload接口返回的upload_id。
upload_id = ''
# 取消指定upload_id的分片上傳事件,已上傳的分片會被刪除。
bucket.abort_multipart_upload(key, upload_id)
列舉已上傳的分片信息
以下代碼用于列舉已上傳的分片信息:
# -*- coding: utf-8 -*-
import os
import oss2
# 阿里云主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創建RAM賬號。
auth = oss2.Auth('', '')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '')
key = ''
# 由init_multipart_upload接口返回的upload_id。
upload_id = ''
# 列舉指定upload_id對應的已上傳分片信息。
for part_info in oss2.PartIterator(bucket, key, upload_id):
print('part_number:', part_info.part_number)
print('etag:', part_info.etag)
print('size:', part_info.size)
列舉已上傳分片的更多詳情,請參見ListParts。
列舉分片上傳事件
列舉指定Object的分片上傳事件
以下代碼用于列舉指定Object的分片上傳事件:
# -*- coding: utf-8 -*-
import os
import oss2
# 阿里云主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創建RAM賬號。
auth = oss2.Auth('', '')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '')
key = ''
# 列舉Object的所有分片上傳事件。對于同一個Object,每次調用init_multipart_upload均會返回不同的upload_id。
# 一個upload_id對應一個分片上傳事件。
for upload_info in oss2.ObjectUploadIterator(bucket, key):
print('key:', upload_info.key)
print('upload_id:', upload_info.upload_id)
列舉存儲空間下的所有分片事件
以下代碼用于列舉存儲空間下的所有分片上傳事件:
# -*- coding: utf-8 -*-
import os
import oss2
# 阿里云主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創建RAM賬號。
auth = oss2.Auth('', '')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '')
# 列舉存儲空間下的所有分片上傳事件。
for upload_info in oss2.MultipartUploadIterator(bucket):
print('key:', upload_info.key)
print('upload_id:', upload_info.upload_id)
列舉存儲空間下指定前綴Object的分片上傳事件
以下代碼用于列舉存儲空間下指定前綴Object的分片上傳事件:
# -*- coding: utf-8 -*-
import os
import oss2
# 阿里云主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創建RAM賬號。
auth = oss2.Auth('', '')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '')
# 列舉存儲空間下以'test'為前綴的Object的分片上傳事件。
for upload_info in oss2.MultipartUploadIterator(bucket, prefix='test'):
print('key:', upload_info.key)
print('upload_id:', upload_info.upload_id)
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态