@@ -1692,7 +1692,7 @@ def appendObject(self, bucketName, objectKey, content=None, metadata=None, heade
1692
1692
headers , readable , notifier , entity = self ._prepare_file_notifier_and_entity (offset , file_size , headers ,
1693
1693
progressCallback , file_path ,
1694
1694
readable )
1695
- headers = self .convertor .trans_put_object (metadata = metadata , headers = headers )
1695
+ headers = self .convertor .trans_put_object (metadata = metadata , headers = headers , file_path = file_path )
1696
1696
self .log_client .log (DEBUG , 'send Path:%s' % file_path )
1697
1697
else :
1698
1698
entity = content .get ('content' )
@@ -1701,7 +1701,7 @@ def appendObject(self, bucketName, objectKey, content=None, metadata=None, heade
1701
1701
autoClose , readable ,
1702
1702
chunkedMode , notifier )
1703
1703
1704
- headers = self .convertor .trans_put_object (metadata = metadata , headers = headers )
1704
+ headers = self .convertor .trans_put_object (metadata = metadata , headers = headers , content = content . get ( 'content' ) )
1705
1705
1706
1706
try :
1707
1707
if notifier is not None :
@@ -1727,7 +1727,7 @@ def putContent(self, bucketName, objectKey, content=None, metadata=None, headers
1727
1727
headers = PutObjectHeader ()
1728
1728
if headers .get ('contentType' ) is None :
1729
1729
headers ['contentType' ] = const .MIME_TYPES .get (objectKey [objectKey .rfind ('.' ) + 1 :].lower ())
1730
- _headers = self .convertor .trans_put_object (metadata = metadata , headers = headers )
1730
+ _headers = self .convertor .trans_put_object (metadata = metadata , headers = headers , content = content )
1731
1731
1732
1732
readable = False
1733
1733
chunkedMode = False
@@ -1789,12 +1789,12 @@ def putFile(self, bucketName, objectKey, file_path, metadata=None, headers=None,
1789
1789
__file_path = os .path .join (file_path , f )
1790
1790
if not const .IS_PYTHON2 :
1791
1791
if not objectKey :
1792
- key = util .safe_trans_to_gb2312 ('{0}/ ' .format (os .path .split (file_path )[1 ]) + f )
1792
+ key = util .safe_trans_to_gb2312 ('{0}' .format (os .path .split (file_path )[1 ]) + f )
1793
1793
else :
1794
1794
key = '{0}/' .format (objectKey ) + util .safe_trans_to_gb2312 (f )
1795
1795
else :
1796
1796
if not objectKey :
1797
- key = util .safe_trans_to_gb2312 ('{0}/ ' .format (os .path .split (file_path )[1 ]) + f ).decode (
1797
+ key = util .safe_trans_to_gb2312 ('{0}' .format (os .path .split (file_path )[1 ]) + f ).decode (
1798
1798
'GB2312' ).encode ('UTF-8' )
1799
1799
else :
1800
1800
key = '{0}/' .format (objectKey ) + util .safe_trans_to_gb2312 (f ).decode ('GB2312' ).encode ('UTF-8' )
@@ -1810,7 +1810,7 @@ def putFile(self, bucketName, objectKey, file_path, metadata=None, headers=None,
1810
1810
1811
1811
headers = self ._putFileHandleHeader (headers , size , objectKey , file_path )
1812
1812
1813
- _headers = self .convertor .trans_put_object (metadata = metadata , headers = headers )
1813
+ _headers = self .convertor .trans_put_object (metadata = metadata , headers = headers , file_path = file_path )
1814
1814
if const .CONTENT_LENGTH_HEADER not in _headers :
1815
1815
_headers [const .CONTENT_LENGTH_HEADER ] = util .to_string (size )
1816
1816
self .log_client .log (DEBUG , 'send Path:%s' % file_path )
@@ -1857,13 +1857,16 @@ def _get_part_size(partSize, file_size, offset):
1857
1857
partSize = partSize if partSize is not None and 0 < partSize <= (file_size - offset ) else file_size - offset
1858
1858
return partSize
1859
1859
1860
- def _prepare_headers (self , md5 , isAttachMd5 , file_path , partSize , offset , sseHeader , headers ):
1860
+ def _prepare_headers (self , md5 , isAttachMd5 , crc64 , isAttachCrc64 , file_path , partSize , offset , sseHeader , headers ):
1861
1861
if md5 :
1862
1862
headers [const .CONTENT_MD5_HEADER ] = md5
1863
1863
elif isAttachMd5 :
1864
1864
headers [const .CONTENT_MD5_HEADER ] = util .base64_encode (
1865
1865
util .md5_file_encode_by_size_offset (file_path , partSize , offset , self .chunk_size ))
1866
-
1866
+ if crc64 :
1867
+ self .convertor ._put_key_value (headers , self .ha .crc64_header (), crc64 )
1868
+ elif isAttachCrc64 :
1869
+ self .convertor ._put_key_value (headers , self .ha .crc64_header (), util .calculate_file_crc64 (file_path , offset = offset , totalCount = partSize ))
1867
1870
if sseHeader is not None :
1868
1871
self .convertor ._set_sse_header (sseHeader , headers , True )
1869
1872
@@ -1879,12 +1882,15 @@ def _prepare_upload_part_notifier(partSize, progressCallback, readable):
1879
1882
1880
1883
return readable , notifier
1881
1884
1882
- def _get_headers (self , md5 , sseHeader , headers ):
1885
+ def _get_headers (self , md5 , crc64 , isAttachCrc64 , content , sseHeader , headers ):
1883
1886
if md5 :
1884
1887
headers [const .CONTENT_MD5_HEADER ] = md5
1885
1888
if sseHeader is not None :
1886
1889
self .convertor ._set_sse_header (sseHeader , headers , True )
1887
-
1890
+ if crc64 :
1891
+ headers [self .ha .crc64_header ()] = crc64
1892
+ elif isAttachCrc64 :
1893
+ headers [self .ha .crc64_header ()] = util .calculate_content_crc64 (util .covert_string_to_bytes (content ))
1888
1894
return headers
1889
1895
1890
1896
@staticmethod
@@ -1911,7 +1917,7 @@ def _check_file_part_info(self, file_path, offset, partSize):
1911
1917
@funcCache
1912
1918
def uploadPart (self , bucketName , objectKey , partNumber , uploadId , object = None , isFile = False , partSize = None ,
1913
1919
offset = 0 , sseHeader = None , isAttachMd5 = False , md5 = None , content = None , progressCallback = None ,
1914
- autoClose = True , extensionHeaders = None ):
1920
+ autoClose = True , isAttachCrc64 = False , crc64 = None , extensionHeaders = None ):
1915
1921
self ._assert_not_null (partNumber , 'partNumber is empty' )
1916
1922
self ._assert_not_null (uploadId , 'uploadId is empty' )
1917
1923
@@ -1926,7 +1932,7 @@ def uploadPart(self, bucketName, objectKey, partNumber, uploadId, object=None, i
1926
1932
checked_file_part_info = self ._check_file_part_info (content , offset , partSize )
1927
1933
1928
1934
headers = {const .CONTENT_LENGTH_HEADER : util .to_string (checked_file_part_info ["partSize" ])}
1929
- headers = self ._prepare_headers (md5 , isAttachMd5 , checked_file_part_info ["file_path" ],
1935
+ headers = self ._prepare_headers (md5 , isAttachMd5 , crc64 , isAttachCrc64 , checked_file_part_info ["file_path" ],
1930
1936
checked_file_part_info ["partSize" ], checked_file_part_info ["offset" ],
1931
1937
sseHeader , headers )
1932
1938
@@ -1938,7 +1944,7 @@ def uploadPart(self, bucketName, objectKey, partNumber, uploadId, object=None, i
1938
1944
headers = {}
1939
1945
if content is not None and hasattr (content , 'read' ) and callable (content .read ):
1940
1946
readable = True
1941
- headers = self ._get_headers (md5 , sseHeader , headers )
1947
+ headers = self ._get_headers (md5 , crc64 , isAttachCrc64 , content , sseHeader , headers )
1942
1948
1943
1949
if partSize is None :
1944
1950
self .log_client .log (DEBUG , 'missing partSize when uploading a readable stream' )
@@ -1956,7 +1962,7 @@ def uploadPart(self, bucketName, objectKey, partNumber, uploadId, object=None, i
1956
1962
entity = content
1957
1963
if entity is None :
1958
1964
entity = ''
1959
- headers = self ._get_headers (md5 , sseHeader , headers )
1965
+ headers = self ._get_headers (md5 , crc64 , isAttachCrc64 , content , sseHeader , headers )
1960
1966
1961
1967
try :
1962
1968
if notifier is not None :
@@ -1982,7 +1988,7 @@ def check_file_path(file_path):
1982
1988
@funcCache
1983
1989
def _uploadPartWithNotifier (self , bucketName , objectKey , partNumber , uploadId , content = None , isFile = False ,
1984
1990
partSize = None , offset = 0 , sseHeader = None , isAttachMd5 = False , md5 = None , notifier = None ,
1985
- extensionHeaders = None , headers = None ):
1991
+ extensionHeaders = None , headers = None , isAttachCrc64 = False , crc64 = None ):
1986
1992
self ._assert_not_null (partNumber , 'partNumber is empty' )
1987
1993
self ._assert_not_null (uploadId , 'uploadId is empty' )
1988
1994
@@ -1994,7 +2000,7 @@ def _uploadPartWithNotifier(self, bucketName, objectKey, partNumber, uploadId, c
1994
2000
checked_file_part_info = self ._check_file_part_info (content , offset , partSize )
1995
2001
1996
2002
headers [const .CONTENT_LENGTH_HEADER ] = util .to_string (checked_file_part_info ["partSize" ])
1997
- headers = self ._prepare_headers (md5 , isAttachMd5 , checked_file_part_info ["file_path" ],
2003
+ headers = self ._prepare_headers (md5 , isAttachMd5 , crc64 , isAttachCrc64 , checked_file_part_info ["file_path" ],
1998
2004
checked_file_part_info ["partSize" ], checked_file_part_info ["offset" ],
1999
2005
sseHeader , headers )
2000
2006
@@ -2005,7 +2011,7 @@ def _uploadPartWithNotifier(self, bucketName, objectKey, partNumber, uploadId, c
2005
2011
else :
2006
2012
if content is not None and hasattr (content , 'read' ) and callable (content .read ):
2007
2013
readable = True
2008
- headers = self ._get_headers (md5 , sseHeader , headers )
2014
+ headers = self ._get_headers (md5 , crc64 , isAttachCrc64 , content , sseHeader , headers )
2009
2015
2010
2016
if partSize is None :
2011
2017
chunkedMode = True
@@ -2018,7 +2024,7 @@ def _uploadPartWithNotifier(self, bucketName, objectKey, partNumber, uploadId, c
2018
2024
entity = content
2019
2025
if entity is None :
2020
2026
entity = ''
2021
- headers = self ._get_headers (md5 , sseHeader , headers )
2027
+ headers = self ._get_headers (md5 , crc64 , isAttachCrc64 , content , sseHeader , headers )
2022
2028
2023
2029
ret = self ._make_put_request (bucketName , objectKey , pathArgs = {'partNumber' : partNumber , 'uploadId' : uploadId },
2024
2030
headers = headers , entity = entity , chunkedMode = chunkedMode , methodName = 'uploadPart' ,
@@ -2132,16 +2138,16 @@ def copyPart(self, bucketName, objectKey, partNumber, uploadId, copySource, copy
2132
2138
2133
2139
@funcCache
2134
2140
def completeMultipartUpload (self , bucketName , objectKey , uploadId , completeMultipartUploadRequest ,
2135
- extensionHeaders = None , encoding_type = None ):
2141
+ isAttachCrc64 = False , extensionHeaders = None , encoding_type = None ):
2136
2142
self ._assert_not_null (uploadId , 'uploadId is empty' )
2137
2143
self ._assert_not_null (completeMultipartUploadRequest , 'completeMultipartUploadRequest is empty' )
2138
2144
pathArgs = {'uploadId' : uploadId }
2139
2145
if encoding_type is not None :
2140
2146
pathArgs ["encoding-type" ] = encoding_type
2147
+ entity , headers = self .convertor .trans_complete_multipart_upload_request (completeMultipartUploadRequest , isAttachCrc64 )
2141
2148
ret = self ._make_post_request (bucketName , objectKey ,
2142
- pathArgs = pathArgs ,
2143
- entity = self .convertor .trans_complete_multipart_upload_request (
2144
- completeMultipartUploadRequest ), methodName = 'completeMultipartUpload' ,
2149
+ pathArgs = pathArgs , headers = headers ,
2150
+ entity = entity , methodName = 'completeMultipartUpload' ,
2145
2151
extensionHeaders = extensionHeaders )
2146
2152
self ._generate_object_url (ret , bucketName , objectKey )
2147
2153
return ret
0 commit comments