in oss2/resumable.py [0:0]
def resumable_upload(bucket, key, filename,
store=None,
headers=None,
multipart_threshold=None,
part_size=None,
progress_callback=None,
num_threads=None,
params=None):
"""断点上传本地文件。
实现中采用分片上传方式上传本地文件,缺省的并发数是 `oss2.defaults.multipart_num_threads` ,并且在
本地磁盘保存已经上传的分片信息。如果因为某种原因上传被中断,下次上传同样的文件,即源文件和目标文件路径都
一样,就只会上传缺失的分片。
缺省条件下,该函数会在用户 `HOME` 目录下保存断点续传的信息。当待上传的本地文件没有发生变化,
且目标文件名没有变化时,会根据本地保存的信息,从断点开始上传。
使用该函数应注意如下细节:
#. 如果使用CryptoBucket,函数会退化为普通上传
:param bucket: :class:`Bucket <oss2.Bucket>` 或者 ::class:`CryptoBucket <oss2.CryptoBucket>` 对象
:param key: 上传到用户空间的文件名
:param filename: 待上传本地文件名
:param store: 用来保存断点信息的持久存储,参见 :class:`ResumableStore` 的接口。如不指定,则使用 `ResumableStore` 。
:param headers: HTTP头部
# 调用外部函数put_object 或 init_multipart_upload传递完整headers
# 调用外部函数uplpad_part目前只传递OSS_REQUEST_PAYER, OSS_TRAFFIC_LIMIT
# 调用外部函数complete_multipart_upload目前只传递OSS_REQUEST_PAYER, OSS_OBJECT_ACL
:type headers: 可以是dict,建议是oss2.CaseInsensitiveDict
:param multipart_threshold: 文件长度大于该值时,则用分片上传。
:param part_size: 指定分片上传的每个分片的大小。如不指定,则自动计算。
:param progress_callback: 上传进度回调函数。参见 :ref:`progress_callback` 。
:param num_threads: 并发上传的线程数,如不指定则使用 `oss2.defaults.multipart_num_threads` 。
:param params: HTTP请求参数
# 只有'sequential'这个参数才会被传递到外部函数init_multipart_upload中。
# 其他参数视为无效参数不会往外部函数传递。
:type params: dict
"""
logger.debug("Start to resumable upload, bucket: {0}, key: {1}, filename: {2}, headers: {3}, "
"multipart_threshold: {4}, part_size: {5}, num_threads: {6}".format(bucket.bucket_name, to_string(key),
filename, headers, multipart_threshold,
part_size, num_threads))
size = os.path.getsize(filename)
multipart_threshold = defaults.get(multipart_threshold, defaults.multipart_threshold)
logger.debug("The size of file to upload is: {0}, multipart_threshold: {1}".format(size, multipart_threshold))
if size >= multipart_threshold:
uploader = _ResumableUploader(bucket, key, filename, size, store,
part_size=part_size,
headers=headers,
progress_callback=progress_callback,
num_threads=num_threads,
params=params)
result = uploader.upload()
else:
with open(to_unicode(filename), 'rb') as f:
result = bucket.put_object(key, f, headers=headers, progress_callback=progress_callback)
return result