@@ -535,38 +535,30 @@ impl S3 {
535
535
let mut data = Vec :: new ( ) ;
536
536
file. read_to_end ( & mut data) . await ?;
537
537
self . client . put ( location, data. into ( ) ) . await ?;
538
- // async_writer.put_part(data.into()).await?;
539
- // async_writer.complete().await?;
538
+
540
539
return Ok ( ( ) ) ;
541
540
} else {
542
- let mut data = Vec :: new ( ) ;
543
- file. read_to_end ( & mut data) . await ?;
541
+ let mut buf = [ 0 ; MIN_MULTIPART_UPLOAD_SIZE ] ;
544
542
545
- // let mut upload_parts = Vec::new();
543
+ let mut tasks = FuturesUnordered :: new ( ) ;
544
+ // let mut tasks = Vec::new();
546
545
547
- let has_final_partial_part = total_size % MIN_MULTIPART_UPLOAD_SIZE > 0 ;
548
- let num_full_parts = total_size / MIN_MULTIPART_UPLOAD_SIZE ;
549
- let total_parts = num_full_parts + if has_final_partial_part { 1 } else { 0 } ;
550
-
551
- // Upload each part
552
- for part_number in 0 ..( total_parts) {
553
- let start_pos = part_number * MIN_MULTIPART_UPLOAD_SIZE ;
554
- let end_pos = if part_number == num_full_parts && has_final_partial_part {
555
- // Last part might be smaller than 5MB (which is allowed)
556
- total_size
557
- } else {
558
- // All other parts must be at least 5MB
559
- start_pos + MIN_MULTIPART_UPLOAD_SIZE
560
- } ;
546
+ while let Ok ( b) = file. read ( & mut buf) . await {
547
+ if b == 0 {
548
+ break ;
549
+ }
561
550
562
551
// Extract this part's data
563
- let part_data = data [ start_pos..end_pos ] . to_vec ( ) ;
552
+ let part_data = buf . to_vec ( ) ;
564
553
565
554
// Upload the part
566
- async_writer. put_part ( part_data. into ( ) ) . await ?;
555
+ tasks. push ( tokio:: spawn ( async_writer. put_part ( part_data. into ( ) ) ) ) ;
556
+ }
567
557
568
- // upload_parts.push(part_number as u64 + 1);
558
+ while let Some ( res) = tasks. next ( ) . await {
559
+ res??;
569
560
}
561
+
570
562
async_writer. complete ( ) . await ?;
571
563
}
572
564
Ok ( ( ) )
0 commit comments