@@ -260,7 +260,9 @@ async fn download_files(
260260 let dir = Path :: new ( "./tmp1" ) ;
261261 for file in s3_obj {
262262 let key = file. key . clone ( ) . unwrap ( ) ;
263- if files_need_update. contains ( & key[ ..32 ] ) {
263+ if files_need_update. contains ( & key[ ..32 ] )
264+ && ( key. ends_with ( ".pdf" ) || key. ends_with ( ".zip" ) )
265+ {
264266 let request = rusoto_s3:: GetObjectRequest {
265267 bucket : bucket. clone ( ) ,
266268 key : key. clone ( ) ,
@@ -668,14 +670,55 @@ async fn backup_files(s3_client: &S3Client, bucket: String) -> anyhow::Result<()
668670 . to_string ( ) ;
669671 let mut retry = 3 ;
670672 while let Err ( e) = s3_client
671- . put_object ( rusoto_s3:: PutObjectRequest {
673+ . create_multipart_upload ( rusoto_s3:: CreateMultipartUploadRequest {
672674 bucket : bucket. clone ( ) ,
673675 key : file_name. clone ( ) ,
674- body : Some ( buf. clone ( ) . into ( ) ) ,
675676 storage_class : Some ( "DEEP_ARCHIVE" . to_string ( ) ) ,
676677 ..Default :: default ( )
677678 } )
678679 . await
680+ . and_then ( |create_result| {
681+ Ok ( async {
682+ let upload_id = create_result. upload_id . unwrap ( ) ;
683+
684+ // Use 5MB chunks (minimum size for S3 multipart)
685+ const CHUNK_SIZE : usize = 5 * 1024 * 1024 ;
686+ let mut parts = Vec :: new ( ) ;
687+
688+ for ( part_number, chunk) in buf. chunks ( CHUNK_SIZE ) . enumerate ( ) {
689+ let part_number = ( part_number + 1 ) as i64 ;
690+
691+ let upload_result = s3_client
692+ . upload_part ( rusoto_s3:: UploadPartRequest {
693+ bucket : bucket. clone ( ) ,
694+ key : file_name. clone ( ) ,
695+ upload_id : upload_id. clone ( ) ,
696+ part_number,
697+ body : Some ( chunk. to_vec ( ) . into ( ) ) ,
698+ ..Default :: default ( )
699+ } )
700+ . await
701+ . unwrap ( ) ;
702+
703+ parts. push ( rusoto_s3:: CompletedPart {
704+ e_tag : upload_result. e_tag ,
705+ part_number : Some ( part_number) ,
706+ } ) ;
707+ }
708+
709+ s3_client
710+ . complete_multipart_upload ( rusoto_s3:: CompleteMultipartUploadRequest {
711+ bucket : bucket. clone ( ) ,
712+ key : file_name. clone ( ) ,
713+ upload_id,
714+ multipart_upload : Some ( rusoto_s3:: CompletedMultipartUpload {
715+ parts : Some ( parts) ,
716+ } ) ,
717+ ..Default :: default ( )
718+ } )
719+ . await
720+ } )
721+ } )
679722 {
680723 retry -= 1 ;
681724 if retry <= 0 {
0 commit comments