From c0aa969d43d64821abcbefcf669729423ae49d3b Mon Sep 17 00:00:00 2001 From: tiedu Date: Thu, 20 Jun 2019 17:43:03 +0800 Subject: [PATCH 1/2] fix copy --- qcloud_cos/cos_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 0d5156d6..3b039093 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -2390,7 +2390,7 @@ def copy(self, Bucket, Key, CopySource, CopyStatus='Copy', PartSize=10, MAXThrea ) """ # 同园区直接走copy_object - if self._check_same_region(self._conf._endpoint, CopySource): + if self._check_same_region(self._conf._endpoint, CopySource) and 'StorageClass' not in kwargs: response = self.copy_object(Bucket=Bucket, Key=Key, CopySource=CopySource, CopyStatus=CopyStatus, **kwargs) return response From d59f47dfe62241fbadf6de2b564992f71daa199c Mon Sep 17 00:00:00 2001 From: tiedu Date: Thu, 20 Jun 2019 20:50:59 +0800 Subject: [PATCH 2/2] fix copy --- qcloud_cos/cos_client.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 3b039093..f529220e 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -2340,7 +2340,10 @@ def _inner_head_object(self, CopySource): auth=CosS3Auth(self._conf, path, params=params), headers={}, params=params) - return int(rt.headers['Content-Length']) + storage_class = 'standard' + if 'x-cos-storage-class' in rt.headers: + storage_class = rt.headers['x-cos-storage-class'].lower() + return int(rt.headers['Content-Length']), storage_class def _upload_part_copy(self, bucket, key, part_number, upload_id, copy_source, copy_source_range, md5_lst): """拷贝指定文件至分块上传,记录结果到lst中去 @@ -2389,13 +2392,18 @@ def copy(self, Bucket, Key, CopySource, CopyStatus='Copy', PartSize=10, MAXThrea MAXThread=10 ) """ - # 同园区直接走copy_object - if self._check_same_region(self._conf._endpoint, CopySource) and 'StorageClass' not in kwargs: + # 先查询下拷贝源object的content-length + file_size, src_storage_class = self._inner_head_object(CopySource) + + dst_storage_class = 'standard' + if 'StorageClass' in kwargs: + dst_storage_class = kwargs['StorageClass'].lower() + + # 同园区且不改存储类型的情况下直接走copy_object + if self._check_same_region(self._conf._endpoint, CopySource) and src_storage_class == dst_storage_class: response = self.copy_object(Bucket=Bucket, Key=Key, CopySource=CopySource, CopyStatus=CopyStatus, **kwargs) return response - # 不同园区查询拷贝源object的content-length - file_size = self._inner_head_object(CopySource) # 如果源文件大小小于5G,则直接调用copy_object接口 if file_size < SINGLE_UPLOAD_LENGTH: response = self.copy_object(Bucket=Bucket, Key=Key, CopySource=CopySource, CopyStatus=CopyStatus, **kwargs)