yoshidan / google-cloud-rust

Google Cloud Client Libraries for Rust.
MIT License
248 stars 89 forks source link

Add resumable upload #112

Closed yoshidan closed 1 year ago

yoshidan commented 1 year ago

https://cloud.google.com/storage/docs/performing-resumable-uploads

ref #107

     async fn run_with_metadata(client:Client) {
         let mut metadata = HashMap::<String, String>::new();
         metadata.insert("key1".to_string(), "value1".to_string());
         let upload_type = UploadType::Multipart(Box::new(Object {
             name: "test1_meta".to_string(),
             content_type: Some("text/plain".to_string()),
             metadata: Some(metadata),
             ..Default::default()
         }));
         let uploader = client.prepare_resumable_upload(&UploadObjectRequest{
             bucket: "bucket".to_string(),
             ..Default::default()
         }, &upload_type, None).await.unwrap();

         let chunk1_data : Vec<u8>= (0..256 * 1024).map(|i| (i % 256) as u8).collect();
         let chunk2_data : Vec<u8>= (1..256 * 1024 + 50).map(|i| (i % 256) as u8).collect();
         let total_size = TotalSize::Known(chunk1_data.len() + chunk2_data.len());

         // The chunk size should be multiple of 256KiB, unless it's the last chunk that completes the upload.
         let chunk1 = ChunkSize::new(0, chunk1_data.len() - 1, total_size.clone()).unwrap();
         let status1 = uploader.upload_multiple_chunk(chunk1_data.clone(), &chunk1).await.unwrap();
         assert_eq!(status1, UploadStatus::ResumeIncomplete);

         let chunk2 = ChunkSize::new(chunk1_data.len(), chunk1_data.len() + chunk2_data.len() - 1, total_size.clone()).unwrap();
         let status2 = uploader.upload_multiple_chunk(chunk2_data.clone(), &chunk2).await.unwrap();
         assert_eq!(status2, UploadStatus::Ok);