diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 33a668f1..fe345eef 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -3194,7 +3194,7 @@ def _check_all_upload_parts(self, bucket, key, uploadid, local_path, parts_num, already_exist_parts[part_num] = part['ETag'] return True - def download_file(self, Bucket, Key, DestFilePath, PartSize=20, MAXThread=5, EnableCRC=False, **Kwargs): + def download_file(self, Bucket, Key, DestFilePath, PartSize=20, MAXThread=5, EnableCRC=False, progress_callback=None, **Kwargs): """小于等于20MB的文件简单下载,大于20MB的文件使用续传下载 :param Bucket(string): 存储桶名称. @@ -3224,8 +3224,13 @@ def download_file(self, Bucket, Key, DestFilePath, PartSize=20, MAXThread=5, Ena response['Body'].get_stream_to_file(DestFilePath) return + # 支持回调查看进度 + callback = None + if progress_callback: + callback = ProgressCallback(file_size, progress_callback) + downloader = ResumableDownLoader(self, Bucket, Key, DestFilePath, object_info, PartSize, MAXThread, EnableCRC, - **Kwargs) + callback, **Kwargs) downloader.start() def upload_file(self, Bucket, Key, LocalFilePath, PartSize=1, MAXThread=5, EnableMD5=False, progress_callback=None, diff --git a/qcloud_cos/resumable_downloader.py b/qcloud_cos/resumable_downloader.py index 5e17587a..f2ac5298 100644 --- a/qcloud_cos/resumable_downloader.py +++ b/qcloud_cos/resumable_downloader.py @@ -17,7 +17,7 @@ class ResumableDownLoader(object): def __init__(self, cos_client, bucket, key, dest_filename, object_info, part_size=20, max_thread=5, - enable_crc=False, **kwargs): + enable_crc=False, progress_callback=None, **kwargs): self.__cos_client = cos_client self.__bucket = bucket self.__key = key @@ -25,6 +25,7 @@ def __init__(self, cos_client, bucket, key, dest_filename, object_info, part_siz self.__object_info = object_info self.__max_thread = max_thread self.__enable_crc = enable_crc + self.__progress_callback = progress_callback self.__headers = kwargs self.__max_part_count = 100 # 取决于服务端是否对并发有限制 @@ -50,6 +51,11 @@ def start(self): assert self.__tmp_file open(self.__tmp_file, 'a').close() + # 已完成分块先设置下载进度 + if self.__progress_callback: + for finished_part in self.__finished_parts: + self.__progress_callback.report(finished_part.length) + parts_need_to_download = self.__get_parts_need_to_download() logger.debug('parts_need_to_download: {0}'.format(parts_need_to_download)) pool = SimpleThreadPool(self.__max_thread) @@ -126,6 +132,9 @@ def __download_part(self, part, headers): self.__finish_part(part) + if self.__progress_callback: + self.__progress_callback.report(part.length) + def __finish_part(self, part): logger.debug('download part finished,bucket: {0}, key: {1}, part_id: {2}'. format(self.__bucket, self.__key, part.part_id))