Skip to content

Commit cf0e6e4

Browse files
committed
fix: key must end with .pdf or .zip && use multipart_upload
1 parent f47d14e commit cf0e6e4

File tree

1 file changed

+46
-3
lines changed

1 file changed

+46
-3
lines changed

src/bin/upload-metadata.rs

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)