1
+ import math
1
2
from collections import namedtuple
2
3
from concurrent import futures
3
4
from io import BytesIO
@@ -65,7 +66,7 @@ def _recover_from_record(
65
66
if (
66
67
not record_upload_id or
67
68
record_modify_time != context .modify_time or
68
- record_expired_at > time ()
69
+ record_expired_at < time ()
69
70
):
70
71
return context
71
72
@@ -80,6 +81,10 @@ def _recover_from_record(
80
81
etag = p ['etag' ]
81
82
)
82
83
for p in record_etags
84
+ if (
85
+ p .get ('partNumber' , None ) and
86
+ p .get ('etag' , None )
87
+ )
83
88
],
84
89
resumed = True
85
90
)
@@ -105,7 +110,7 @@ def _set_to_record(self, file_name, key, context):
105
110
'etags' : [
106
111
{
107
112
'etag' : part .etag ,
108
- 'part_no ' : part .part_no
113
+ 'partNumber ' : part .part_no
109
114
}
110
115
for part in context .parts
111
116
]
@@ -170,6 +175,7 @@ def initial_parts(
170
175
data_size = None ,
171
176
modify_time = None ,
172
177
part_size = None ,
178
+ file_name = None ,
173
179
** kwargs
174
180
):
175
181
"""
@@ -183,6 +189,7 @@ def initial_parts(
183
189
data_size: int
184
190
modify_time: int
185
191
part_size: int
192
+ file_name: str
186
193
kwargs
187
194
188
195
Returns
@@ -222,7 +229,8 @@ def initial_parts(
222
229
)
223
230
224
231
# try to recover from record
225
- file_name = path .basename (file_path ) if file_path else None
232
+ if not file_name and file_path :
233
+ file_name = path .basename (file_path )
226
234
context = self ._recover_from_record (
227
235
file_name ,
228
236
key ,
@@ -307,7 +315,10 @@ def upload_parts(
307
315
308
316
# initial upload state
309
317
part , resp = None , None
310
- uploaded_size = 0
318
+ uploaded_size = context .part_size * len (context .parts )
319
+ if math .ceil (data_size / context .part_size ) in [p .part_no for p in context .parts ]:
320
+ # if last part uploaded, should correct the uploaded size
321
+ uploaded_size += (data_size % context .part_size ) - context .part_size
311
322
lock = Lock ()
312
323
313
324
if not self .concurrent_executor :
@@ -500,6 +511,7 @@ def upload(
500
511
up_token ,
501
512
key ,
502
513
file_path = file_path ,
514
+ file_name = file_name ,
503
515
data = data ,
504
516
data_size = data_size ,
505
517
modify_time = modify_time ,
0 commit comments