From 3763f6078da0c72e8277cb18482a93460856eadf Mon Sep 17 00:00:00 2001 From: nidhiii-27 Date: Tue, 4 Nov 2025 15:09:08 +0530 Subject: [PATCH 1/8] samples: add samples for mpu --- .../multipartupload/AbortMultipartUpload.java | 45 +++++++++++ .../CompleteMultipartUpload.java | 63 +++++++++++++++ .../CreateMultipartUpload.java | 32 ++++++++ .../storage/multipartupload/ListParts.java | 50 ++++++++++++ .../multipartupload/UploadPartFromFile.java | 80 +++++++++++++++++++ 5 files changed, 270 insertions(+) create mode 100644 samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java create mode 100644 samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java create mode 100644 samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java create mode 100644 samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java create mode 100644 samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java new file mode 100644 index 0000000000..ccf54e9427 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java @@ -0,0 +1,45 @@ +package com.example.storage.multipartupload; + +import com.google.cloud.storage.HttpStorageOptions; +import com.google.cloud.storage.MultipartUploadClient; +import com.google.cloud.storage.MultipartUploadSettings; +import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadRequest; +import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; +import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; + +public class AbortMultipartUpload { + public static void abortMultipartUpload(String projectId, String bucketName, String objectName) { + // The ID of your GCP project + // String projectId = "your-project-id"; + + // The ID of your GCS bucket + // String bucketName = "your-unique-bucket-name"; + + // The ID of your GCS object + // String objectName = "your-object-name"; + + HttpStorageOptions storageOptions = + HttpStorageOptions.newBuilder().setProjectId(projectId).build(); + MultipartUploadSettings mpuSettings = MultipartUploadSettings.of(storageOptions); + MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); + + System.out.println("Initiating a multipart upload to abort for " + objectName); + CreateMultipartUploadRequest createRequest = + CreateMultipartUploadRequest.builder().bucket(bucketName).key(objectName).build(); + CreateMultipartUploadResponse createResponse = mpuClient.createMultipartUpload(createRequest); + String uploadId = createResponse.uploadId().trim(); + System.out.println("Upload ID to be aborted: " + uploadId); + + System.out.println("Aborting multipart upload: " + uploadId); + AbortMultipartUploadRequest abortRequest = + AbortMultipartUploadRequest.builder() + .bucket(bucketName) + .key(objectName) + .uploadId(uploadId) + .build(); + + mpuClient.abortMultipartUpload(abortRequest); + + System.out.println("Multipart upload with ID " + uploadId + " has been successfully aborted."); + } +} diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java new file mode 100644 index 0000000000..ffd0bf4a03 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java @@ -0,0 +1,63 @@ +package com.example.storage.multipartupload; + +import com.google.cloud.storage.HttpStorageOptions; +import com.google.cloud.storage.MultipartUploadClient; +import com.google.cloud.storage.MultipartUploadSettings; +import com.google.cloud.storage.multipartupload.model.CompleteMultipartUploadRequest; +import com.google.cloud.storage.multipartupload.model.CompleteMultipartUploadResponse; +import com.google.cloud.storage.multipartupload.model.CompletedMultipartUpload; +import com.google.cloud.storage.multipartupload.model.CompletedPart; +import java.util.List; + +public class CompleteMultipartUpload { + public static void completeMultipartUpload( + String projectId, + String bucketName, + String objectName, + String uploadId, + List completedParts) { + + // The ID of your GCP project + // String projectId = "your-project-id"; + + // The ID of your GCS bucket + // String bucketName = "your-unique-bucket-name"; + + // The ID of your GCS object + // String objectName = "your-object-name"; + + // The ID of the multipart upload + // String uploadId = "your-upload-id"; + + // The list of completed parts from the UploadPart responses. + // List completedParts = ...; + + HttpStorageOptions storageOptions = + HttpStorageOptions.newBuilder().setProjectId(projectId).build(); + MultipartUploadSettings mpuSettings = MultipartUploadSettings.of(storageOptions); + MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); + + System.out.println("Completing multipart upload for " + objectName); + + CompletedMultipartUpload completedMultipartUpload = + CompletedMultipartUpload.builder().parts(completedParts).build(); + + CompleteMultipartUploadRequest completeRequest = + CompleteMultipartUploadRequest.builder() + .bucket(bucketName) + .key(objectName) + .uploadId(uploadId) + .multipartUpload(completedMultipartUpload) + .build(); + + CompleteMultipartUploadResponse completeResponse = + mpuClient.completeMultipartUpload(completeRequest); + + System.out.println( + "Upload complete for " + + completeResponse.key() + + " in bucket " + + completeResponse.bucket()); + System.out.println("Final ETag: " + completeResponse.etag()); + } +} diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java new file mode 100644 index 0000000000..eb05d26267 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java @@ -0,0 +1,32 @@ +package com.example.storage.multipartupload; + +import com.google.cloud.storage.HttpStorageOptions; +import com.google.cloud.storage.MultipartUploadClient; +import com.google.cloud.storage.MultipartUploadSettings; +import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; +import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; + +public class CreateMultipartUpload { + public static void createMultipartUpload(String projectId, String bucketName, String objectName) { + // The ID of your GCP project + // String projectId = "your-project-id"; + + // The ID of your GCS bucket + // String sourceBucketName = "your-unique-bucket-name"; + + // The ID of your GCS object + // String sourceObjectName = "your-object-name"; + + HttpStorageOptions storageOptions = + HttpStorageOptions.newBuilder().setProjectId(projectId).build(); + MultipartUploadSettings mpuSettings = MultipartUploadSettings.of(storageOptions); + MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); + + System.out.println("Initiating multipart upload for " + objectName); + CreateMultipartUploadRequest createRequest = + CreateMultipartUploadRequest.builder().bucket(bucketName).key(objectName).build(); + CreateMultipartUploadResponse createResponse = mpuClient.createMultipartUpload(createRequest); + String uploadId = createResponse.uploadId(); + System.out.println("Upload ID: " + uploadId); + } +} diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java new file mode 100644 index 0000000000..a05646d3fa --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java @@ -0,0 +1,50 @@ +package com.example.storage.multipartupload; + +import com.google.cloud.storage.HttpStorageOptions; +import com.google.cloud.storage.MultipartUploadClient; +import com.google.cloud.storage.MultipartUploadSettings; +import com.google.cloud.storage.multipartupload.model.ListPartsRequest; +import com.google.cloud.storage.multipartupload.model.ListPartsResponse; +import com.google.cloud.storage.multipartupload.model.Part; + +public class ListParts { + public static void listParts( + String projectId, String bucketName, String objectName, String uploadId) { + // The ID of your GCP project + // String projectId = "your-project-id"; + + // The ID of your GCS bucket + // String bucketName = "your-unique-bucket-name"; + + // The ID of your GCS object + // String objectName = "your-object-name"; + + // The ID of the multipart upload + // String uploadId = "your-upload-id"; + + HttpStorageOptions storageOptions = + HttpStorageOptions.newBuilder().setProjectId(projectId).build(); + MultipartUploadSettings mpuSettings = MultipartUploadSettings.of(storageOptions); + MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); + + System.out.println("Listing parts for upload ID: " + uploadId); + + ListPartsRequest listPartsRequest = + ListPartsRequest.builder().bucket(bucketName).key(objectName).uploadId(uploadId).build(); + + ListPartsResponse listPartsResponse = mpuClient.listParts(listPartsRequest); + + if (listPartsResponse.getParts() == null || listPartsResponse.getParts().isEmpty()) { + System.out.println("No parts have been uploaded yet."); + return; + } + + System.out.println("Uploaded Parts:"); + for (Part part : listPartsResponse.getParts()) { + System.out.println(" - Part Number: " + part.partNumber()); + System.out.println(" ETag: " + part.eTag()); + System.out.println(" Size: " + part.size() + " bytes"); + System.out.println(" Last Modified: " + part.lastModified()); + } + } +} diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java new file mode 100644 index 0000000000..bd31994788 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java @@ -0,0 +1,80 @@ +package com.example.storage.multipartupload; + +import com.google.cloud.storage.HttpStorageOptions; +import com.google.cloud.storage.MultipartUploadClient; +import com.google.cloud.storage.MultipartUploadSettings; +import com.google.cloud.storage.RequestBody; +import com.google.cloud.storage.multipartupload.model.UploadPartRequest; +import com.google.cloud.storage.multipartupload.model.UploadPartResponse; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; + +public class UploadPartFromFile { + public static void uploadPartFromFile( + String projectId, String bucketName, String objectName, String uploadId, String filePath) + throws IOException { + // The ID of your GCP project + // String projectId = "your-project-id"; + + // The ID of your GCS bucket + // String bucketName = "your-unique-bucket-name"; + + // The ID of your GCS object + // String objectName = "your-object-name"; + + // The ID of the multipart upload + // String uploadId = "your-upload-id"; + + // The path to the file to upload + // String filePath = "/path/to/your/file.txt"; + + HttpStorageOptions storageOptions = + HttpStorageOptions.newBuilder().setProjectId(projectId).build(); + MultipartUploadSettings mpuSettings = MultipartUploadSettings.of(storageOptions); + MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); + + // The minimum part size for a multipart upload is 5 MiB, except for the last part. + // We are using 8MiB as our part size. You can change this to a different value + // to optimize for performance. + int partSize = 5 * 1024 * 1024; + + Path path = Paths.get(filePath); + long fileSize = Files.size(path); + long partCount = (long) Math.ceil((double) fileSize / partSize); + System.out.println("File will be uploaded in " + partCount + " parts."); + + try (FileChannel channel = FileChannel.open(path, StandardOpenOption.READ)) { + ByteBuffer buffer = ByteBuffer.allocate(partSize); + for (int partNumber = 1; partNumber <= partCount; partNumber++) { + buffer.clear(); + int bytesRead = channel.read(buffer); + buffer.flip(); + + // The RewindableContent is important for retrying failed uploads. + RequestBody requestBody = RequestBody.of(buffer.slice(0, bytesRead)); + + System.out.println("Uploading part " + partNumber); + UploadPartRequest uploadPartRequest = + UploadPartRequest.builder() + .bucket(bucketName) + .key(objectName) + .partNumber(partNumber) + .uploadId(uploadId) + .build(); + + UploadPartResponse uploadPartResponse = + mpuClient.uploadPart(uploadPartRequest, requestBody); + + System.out.println( + "Part " + partNumber + " uploaded with ETag: " + uploadPartResponse.eTag()); + } + } + + System.out.println("All parts uploaded."); + } +} From 2dc2d0a635419bc3a2e48afa6359fff2a7857ec9 Mon Sep 17 00:00:00 2001 From: nidhiii-27 Date: Tue, 4 Nov 2025 17:59:39 +0530 Subject: [PATCH 2/8] add region tags and copyright headers --- .../multipartupload/AbortMultipartUpload.java | 20 +++++++++++++++- .../CompleteMultipartUpload.java | 19 +++++++++++++++ .../CreateMultipartUpload.java | 19 +++++++++++++++ .../storage/multipartupload/ListParts.java | 19 +++++++++++++++ .../multipartupload/UploadPartFromFile.java | 24 +++++++++++++++---- 5 files changed, 96 insertions(+), 5 deletions(-) diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java index ccf54e9427..ee9c68d591 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java @@ -1,5 +1,23 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.example.storage.multipartupload; +// [START storage_abort_multipart_upload] + import com.google.cloud.storage.HttpStorageOptions; import com.google.cloud.storage.MultipartUploadClient; import com.google.cloud.storage.MultipartUploadSettings; @@ -28,7 +46,6 @@ public static void abortMultipartUpload(String projectId, String bucketName, Str CreateMultipartUploadRequest.builder().bucket(bucketName).key(objectName).build(); CreateMultipartUploadResponse createResponse = mpuClient.createMultipartUpload(createRequest); String uploadId = createResponse.uploadId().trim(); - System.out.println("Upload ID to be aborted: " + uploadId); System.out.println("Aborting multipart upload: " + uploadId); AbortMultipartUploadRequest abortRequest = @@ -43,3 +60,4 @@ public static void abortMultipartUpload(String projectId, String bucketName, Str System.out.println("Multipart upload with ID " + uploadId + " has been successfully aborted."); } } +// [END storage_abort_multipart_upload] \ No newline at end of file diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java index ffd0bf4a03..8962e4c2ec 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java @@ -1,5 +1,23 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.example.storage.multipartupload; +// [START storage_complete_multipart_upload] + import com.google.cloud.storage.HttpStorageOptions; import com.google.cloud.storage.MultipartUploadClient; import com.google.cloud.storage.MultipartUploadSettings; @@ -61,3 +79,4 @@ public static void completeMultipartUpload( System.out.println("Final ETag: " + completeResponse.etag()); } } +// [END storage_complete_multipart_upload] \ No newline at end of file diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java index eb05d26267..d9c189cec9 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java @@ -1,5 +1,23 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.example.storage.multipartupload; +// [START storage_create_multipart_upload] + import com.google.cloud.storage.HttpStorageOptions; import com.google.cloud.storage.MultipartUploadClient; import com.google.cloud.storage.MultipartUploadSettings; @@ -30,3 +48,4 @@ public static void createMultipartUpload(String projectId, String bucketName, St System.out.println("Upload ID: " + uploadId); } } +// [END storage_create_multipart_upload] \ No newline at end of file diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java index a05646d3fa..f1457cd9a1 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java @@ -1,5 +1,23 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.example.storage.multipartupload; +// [START storage_list_parts] + import com.google.cloud.storage.HttpStorageOptions; import com.google.cloud.storage.MultipartUploadClient; import com.google.cloud.storage.MultipartUploadSettings; @@ -48,3 +66,4 @@ public static void listParts( } } } +// [END storage_list_parts] \ No newline at end of file diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java index bd31994788..23d76f1067 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java @@ -1,5 +1,23 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.example.storage.multipartupload; +// [START storage_upload_part] + import com.google.cloud.storage.HttpStorageOptions; import com.google.cloud.storage.MultipartUploadClient; import com.google.cloud.storage.MultipartUploadSettings; @@ -39,9 +57,7 @@ public static void uploadPartFromFile( MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); // The minimum part size for a multipart upload is 5 MiB, except for the last part. - // We are using 8MiB as our part size. You can change this to a different value - // to optimize for performance. - int partSize = 5 * 1024 * 1024; + int partSize = 8 * 1024 * 1024; Path path = Paths.get(filePath); long fileSize = Files.size(path); @@ -55,7 +71,6 @@ public static void uploadPartFromFile( int bytesRead = channel.read(buffer); buffer.flip(); - // The RewindableContent is important for retrying failed uploads. RequestBody requestBody = RequestBody.of(buffer.slice(0, bytesRead)); System.out.println("Uploading part " + partNumber); @@ -78,3 +93,4 @@ public static void uploadPartFromFile( System.out.println("All parts uploaded."); } } +// [END storage_upload_part] \ No newline at end of file From 3109c22a56fcd577110df0c1021effbdfb88c06c Mon Sep 17 00:00:00 2001 From: nidhiii-27 Date: Tue, 4 Nov 2025 18:00:30 +0530 Subject: [PATCH 3/8] formatting --- .../example/storage/multipartupload/AbortMultipartUpload.java | 2 +- .../storage/multipartupload/CompleteMultipartUpload.java | 2 +- .../example/storage/multipartupload/CreateMultipartUpload.java | 2 +- .../java/com/example/storage/multipartupload/ListParts.java | 2 +- .../com/example/storage/multipartupload/UploadPartFromFile.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java index ee9c68d591..ffbb4afb3f 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java @@ -60,4 +60,4 @@ public static void abortMultipartUpload(String projectId, String bucketName, Str System.out.println("Multipart upload with ID " + uploadId + " has been successfully aborted."); } } -// [END storage_abort_multipart_upload] \ No newline at end of file +// [END storage_abort_multipart_upload] diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java index 8962e4c2ec..bf277dc8b1 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/CompleteMultipartUpload.java @@ -79,4 +79,4 @@ public static void completeMultipartUpload( System.out.println("Final ETag: " + completeResponse.etag()); } } -// [END storage_complete_multipart_upload] \ No newline at end of file +// [END storage_complete_multipart_upload] diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java index d9c189cec9..e1eb2782ca 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java @@ -48,4 +48,4 @@ public static void createMultipartUpload(String projectId, String bucketName, St System.out.println("Upload ID: " + uploadId); } } -// [END storage_create_multipart_upload] \ No newline at end of file +// [END storage_create_multipart_upload] diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java index f1457cd9a1..d887ce389a 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/ListParts.java @@ -66,4 +66,4 @@ public static void listParts( } } } -// [END storage_list_parts] \ No newline at end of file +// [END storage_list_parts] diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java index 23d76f1067..18b6d23721 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java @@ -93,4 +93,4 @@ public static void uploadPartFromFile( System.out.println("All parts uploaded."); } } -// [END storage_upload_part] \ No newline at end of file +// [END storage_upload_part] From 63178067039efac31c7e29d7ac1f7db4ea59ffa4 Mon Sep 17 00:00:00 2001 From: nidhiii-27 Date: Tue, 4 Nov 2025 18:12:15 +0530 Subject: [PATCH 4/8] edit AbortMultipartUpload sample --- .../multipartupload/AbortMultipartUpload.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java index ffbb4afb3f..9cb9212326 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/AbortMultipartUpload.java @@ -22,11 +22,10 @@ import com.google.cloud.storage.MultipartUploadClient; import com.google.cloud.storage.MultipartUploadSettings; import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadRequest; -import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; -import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; public class AbortMultipartUpload { - public static void abortMultipartUpload(String projectId, String bucketName, String objectName) { + public static void abortMultipartUpload( + String projectId, String bucketName, String objectName, String uploadId) { // The ID of your GCP project // String projectId = "your-project-id"; @@ -36,17 +35,14 @@ public static void abortMultipartUpload(String projectId, String bucketName, Str // The ID of your GCS object // String objectName = "your-object-name"; + // The ID of the multipart upload + // String uploadId = "your-upload-id"; + HttpStorageOptions storageOptions = HttpStorageOptions.newBuilder().setProjectId(projectId).build(); MultipartUploadSettings mpuSettings = MultipartUploadSettings.of(storageOptions); MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); - System.out.println("Initiating a multipart upload to abort for " + objectName); - CreateMultipartUploadRequest createRequest = - CreateMultipartUploadRequest.builder().bucket(bucketName).key(objectName).build(); - CreateMultipartUploadResponse createResponse = mpuClient.createMultipartUpload(createRequest); - String uploadId = createResponse.uploadId().trim(); - System.out.println("Aborting multipart upload: " + uploadId); AbortMultipartUploadRequest abortRequest = AbortMultipartUploadRequest.builder() From f745e2c344c769b39d9f6fe5e1b3f8f6e3f8092c Mon Sep 17 00:00:00 2001 From: nidhiii-27 Date: Mon, 10 Nov 2025 16:41:09 +0530 Subject: [PATCH 5/8] review fixes --- .../CreateMultipartUpload.java | 14 ++- .../storage/multipartupload/UploadPart.java | 74 ++++++++++++++ .../multipartupload/UploadPartFromFile.java | 96 ------------------- 3 files changed, 87 insertions(+), 97 deletions(-) create mode 100644 samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPart.java delete mode 100644 samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java index e1eb2782ca..e4a5cb0d8e 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/CreateMultipartUpload.java @@ -23,6 +23,8 @@ import com.google.cloud.storage.MultipartUploadSettings; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; +import java.util.HashMap; +import java.util.Map; public class CreateMultipartUpload { public static void createMultipartUpload(String projectId, String bucketName, String objectName) { @@ -41,8 +43,18 @@ public static void createMultipartUpload(String projectId, String bucketName, St MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); System.out.println("Initiating multipart upload for " + objectName); + + Map metadata = new HashMap<>(); + metadata.put("key1", "value1"); + String contentType = "text/plain"; CreateMultipartUploadRequest createRequest = - CreateMultipartUploadRequest.builder().bucket(bucketName).key(objectName).build(); + CreateMultipartUploadRequest.builder() + .bucket(bucketName) + .key(objectName) + .metadata(metadata) + .contentType(contentType) + .build(); + CreateMultipartUploadResponse createResponse = mpuClient.createMultipartUpload(createRequest); String uploadId = createResponse.uploadId(); System.out.println("Upload ID: " + uploadId); diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPart.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPart.java new file mode 100644 index 0000000000..f96d8f2b7f --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPart.java @@ -0,0 +1,74 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.storage.multipartupload; + +// [START storage_upload_part] + +import com.google.cloud.storage.HttpStorageOptions; +import com.google.cloud.storage.MultipartUploadClient; +import com.google.cloud.storage.MultipartUploadSettings; +import com.google.cloud.storage.RequestBody; +import com.google.cloud.storage.multipartupload.model.UploadPartRequest; +import com.google.cloud.storage.multipartupload.model.UploadPartResponse; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Random; + +public class UploadPart { + public static void uploadPart( + String projectId, String bucketName, String objectName, String uploadId, int partNumber) + throws IOException { + // The ID of your GCP project + // String projectId = "your-project-id"; + + // The ID of your GCS bucket + // String bucketName = "your-unique-bucket-name"; + + // The ID of your GCS object + // String objectName = "your-object-name"; + + // The ID of the multipart upload + // String uploadId = "your-upload-id"; + + // The part number of the part being uploaded + // int partNumber = 1; + + HttpStorageOptions storageOptions = + HttpStorageOptions.newBuilder().setProjectId(projectId).build(); + MultipartUploadSettings mpuSettings = MultipartUploadSettings.of(storageOptions); + MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); + + // The minimum part size for a multipart upload is 5 MiB, except for the last part. + byte[] bytes = new byte[5 * 1024 * 1024]; + new Random().nextBytes(bytes); + RequestBody requestBody = RequestBody.of(ByteBuffer.wrap(bytes)); + + System.out.println("Uploading part " + partNumber); + UploadPartRequest uploadPartRequest = + UploadPartRequest.builder() + .bucket(bucketName) + .key(objectName) + .partNumber(partNumber) + .uploadId(uploadId) + .build(); + + UploadPartResponse uploadPartResponse = mpuClient.uploadPart(uploadPartRequest, requestBody); + + System.out.println("Part " + partNumber + " uploaded with ETag: " + uploadPartResponse.eTag()); + } +} +// [END storage_upload_part] diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java deleted file mode 100644 index 18b6d23721..0000000000 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPartFromFile.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2025 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.storage.multipartupload; - -// [START storage_upload_part] - -import com.google.cloud.storage.HttpStorageOptions; -import com.google.cloud.storage.MultipartUploadClient; -import com.google.cloud.storage.MultipartUploadSettings; -import com.google.cloud.storage.RequestBody; -import com.google.cloud.storage.multipartupload.model.UploadPartRequest; -import com.google.cloud.storage.multipartupload.model.UploadPartResponse; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardOpenOption; - -public class UploadPartFromFile { - public static void uploadPartFromFile( - String projectId, String bucketName, String objectName, String uploadId, String filePath) - throws IOException { - // The ID of your GCP project - // String projectId = "your-project-id"; - - // The ID of your GCS bucket - // String bucketName = "your-unique-bucket-name"; - - // The ID of your GCS object - // String objectName = "your-object-name"; - - // The ID of the multipart upload - // String uploadId = "your-upload-id"; - - // The path to the file to upload - // String filePath = "/path/to/your/file.txt"; - - HttpStorageOptions storageOptions = - HttpStorageOptions.newBuilder().setProjectId(projectId).build(); - MultipartUploadSettings mpuSettings = MultipartUploadSettings.of(storageOptions); - MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); - - // The minimum part size for a multipart upload is 5 MiB, except for the last part. - int partSize = 8 * 1024 * 1024; - - Path path = Paths.get(filePath); - long fileSize = Files.size(path); - long partCount = (long) Math.ceil((double) fileSize / partSize); - System.out.println("File will be uploaded in " + partCount + " parts."); - - try (FileChannel channel = FileChannel.open(path, StandardOpenOption.READ)) { - ByteBuffer buffer = ByteBuffer.allocate(partSize); - for (int partNumber = 1; partNumber <= partCount; partNumber++) { - buffer.clear(); - int bytesRead = channel.read(buffer); - buffer.flip(); - - RequestBody requestBody = RequestBody.of(buffer.slice(0, bytesRead)); - - System.out.println("Uploading part " + partNumber); - UploadPartRequest uploadPartRequest = - UploadPartRequest.builder() - .bucket(bucketName) - .key(objectName) - .partNumber(partNumber) - .uploadId(uploadId) - .build(); - - UploadPartResponse uploadPartResponse = - mpuClient.uploadPart(uploadPartRequest, requestBody); - - System.out.println( - "Part " + partNumber + " uploaded with ETag: " + uploadPartResponse.eTag()); - } - } - - System.out.println("All parts uploaded."); - } -} -// [END storage_upload_part] From f05031be24973353cb37a02e652e04f259661fe2 Mon Sep 17 00:00:00 2001 From: nidhiii-27 Date: Mon, 10 Nov 2025 16:45:53 +0530 Subject: [PATCH 6/8] formatting --- .../storage/multipartupload/UploadPart.java | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPart.java b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPart.java index f96d8f2b7f..2241a311b8 100644 --- a/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPart.java +++ b/samples/snippets/src/main/java/com/example/storage/multipartupload/UploadPart.java @@ -29,46 +29,46 @@ import java.util.Random; public class UploadPart { - public static void uploadPart( - String projectId, String bucketName, String objectName, String uploadId, int partNumber) - throws IOException { - // The ID of your GCP project - // String projectId = "your-project-id"; + public static void uploadPart( + String projectId, String bucketName, String objectName, String uploadId, int partNumber) + throws IOException { + // The ID of your GCP project + // String projectId = "your-project-id"; - // The ID of your GCS bucket - // String bucketName = "your-unique-bucket-name"; + // The ID of your GCS bucket + // String bucketName = "your-unique-bucket-name"; - // The ID of your GCS object - // String objectName = "your-object-name"; + // The ID of your GCS object + // String objectName = "your-object-name"; - // The ID of the multipart upload - // String uploadId = "your-upload-id"; + // The ID of the multipart upload + // String uploadId = "your-upload-id"; - // The part number of the part being uploaded - // int partNumber = 1; + // The part number of the part being uploaded + // int partNumber = 1; - HttpStorageOptions storageOptions = - HttpStorageOptions.newBuilder().setProjectId(projectId).build(); - MultipartUploadSettings mpuSettings = MultipartUploadSettings.of(storageOptions); - MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); + HttpStorageOptions storageOptions = + HttpStorageOptions.newBuilder().setProjectId(projectId).build(); + MultipartUploadSettings mpuSettings = MultipartUploadSettings.of(storageOptions); + MultipartUploadClient mpuClient = MultipartUploadClient.create(mpuSettings); - // The minimum part size for a multipart upload is 5 MiB, except for the last part. - byte[] bytes = new byte[5 * 1024 * 1024]; - new Random().nextBytes(bytes); - RequestBody requestBody = RequestBody.of(ByteBuffer.wrap(bytes)); + // The minimum part size for a multipart upload is 5 MiB, except for the last part. + byte[] bytes = new byte[5 * 1024 * 1024]; + new Random().nextBytes(bytes); + RequestBody requestBody = RequestBody.of(ByteBuffer.wrap(bytes)); - System.out.println("Uploading part " + partNumber); - UploadPartRequest uploadPartRequest = - UploadPartRequest.builder() - .bucket(bucketName) - .key(objectName) - .partNumber(partNumber) - .uploadId(uploadId) - .build(); + System.out.println("Uploading part " + partNumber); + UploadPartRequest uploadPartRequest = + UploadPartRequest.builder() + .bucket(bucketName) + .key(objectName) + .partNumber(partNumber) + .uploadId(uploadId) + .build(); - UploadPartResponse uploadPartResponse = mpuClient.uploadPart(uploadPartRequest, requestBody); + UploadPartResponse uploadPartResponse = mpuClient.uploadPart(uploadPartRequest, requestBody); - System.out.println("Part " + partNumber + " uploaded with ETag: " + uploadPartResponse.eTag()); - } + System.out.println("Part " + partNumber + " uploaded with ETag: " + uploadPartResponse.eTag()); + } } // [END storage_upload_part] From 4c97103c915b9433af37e9216636d1da67b0753c Mon Sep 17 00:00:00 2001 From: nidhiii-27 Date: Tue, 11 Nov 2025 15:23:59 +0530 Subject: [PATCH 7/8] fix: change to latest version --- samples/install-without-bom/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 1da04a0133..0c2b7236f6 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -30,12 +30,12 @@ com.google.cloud google-cloud-storage - 2.59.0 + 2.60.1-SNAPSHOT com.google.cloud google-cloud-storage-control - 2.59.0 + 2.60.1-SNAPSHOT From 7ad25afaf285efd89e798bfbbcf80f3623831b6b Mon Sep 17 00:00:00 2001 From: nidhiii-27 Date: Tue, 11 Nov 2025 16:10:10 +0530 Subject: [PATCH 8/8] Revert "fix: change to latest version" This reverts commit 4c97103c915b9433af37e9216636d1da67b0753c. --- samples/install-without-bom/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 0c2b7236f6..1da04a0133 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -30,12 +30,12 @@ com.google.cloud google-cloud-storage - 2.60.1-SNAPSHOT + 2.59.0 com.google.cloud google-cloud-storage-control - 2.60.1-SNAPSHOT + 2.59.0