@@ -74,7 +74,8 @@ def start(self):
7474
7575 def __get_record_filename (self , bucket , key , dest_file_path ):
7676 dest_file_path_md5 = hashlib .md5 (dest_file_path ).hexdigest ()
77- return '{0}_{1}.{2}' .format (self .__bucket , self .__key , dest_file_path_md5 )
77+ key_md5 = hashlib .md5 (key ).hexdigest ()
78+ return '{0}_{1}.{2}' .format (bucket , key_md5 , dest_file_path_md5 )
7879
7980 def __determine_part_size_internal (self , file_size , part_size ):
8081 real_part_size = part_size * 1024 * 1024 # MB
@@ -145,11 +146,19 @@ def __load_record(self):
145146 if os .path .exists (self .__record_filepath ):
146147 with open (self .__record_filepath , 'r' ) as f :
147148 record = json .load (f )
149+
150+ ret = self .__check_record (record )
151+ # record记录是否跟head object的一致,不一致则删除
152+ if ret == False :
153+ self .__del_record ()
154+ record = None
155+ else :
148156 self .__part_size = record ['part_size' ]
149157 self .__tmp_file = record ['tmp_filename' ]
150158 if not os .path .exists (self .__tmp_file ):
151159 record = None
152160 self .__tmp_file = None
161+ self .__del_record ()
153162 else :
154163 self .__finished_parts = list (PartInfo (p ['part_id' ], p ['start' ], p ['length' ]) for p in record ['parts' ])
155164 logger .debug ('load record: finished parts nums: {0}' .format (len (self .__finished_parts )))
@@ -158,14 +167,20 @@ def __load_record(self):
158167 if not record :
159168 self .__tmp_file = "{file_name}_{uuid}" .format (file_name = self .__dest_file_path , uuid = uuid .uuid4 ().hex )
160169 record = {'bucket' : self .__bucket , 'key' : self .__key , 'tmp_filename' :self .__tmp_file ,
161- 'part_size' : self .__part_size , 'parts' :[]}
170+ 'mtime' :self .__object_info ['Last-Modified' ], 'etag' :self .__object_info ['ETag' ],
171+ 'file_size' :self .__object_info ['Content-Length' ], 'part_size' : self .__part_size , 'parts' :[]}
162172 self .__record = record
163173 self .__dump_record (record )
164174
175+ def __check_record (self , record ):
176+ return record ['etag' ] == self .__object_info ['ETag' ] and \
177+ record ['mtime' ] == self .__object_info ['Last-Modified' ] and \
178+ record ['file_size' ] == self .__object_info ['Content-Length' ]
179+
165180 def __del_record (self ):
166- os .remove (self .__record_filepath )
167- logger .debug ('ResumableDownLoader delete record_file, path: {0}' .format (self .__record_filepath ))
168-
181+ os .remove (self .__record_filepath )
182+ logger .debug ('ResumableDownLoader delete record_file, path: {0}' .format (self .__record_filepath ))
183+
169184 def __check_crc (self ):
170185 logger .debug ('start to check crc' )
171186 c64 = crcmod .mkCrcFun (0x142F0E1EBA9EA3693L , initCrc = 0L , xorOut = 0xffffffffffffffffL , rev = True )
0 commit comments