Mengunggah Arsip Besar dalam Beberapa Bagian Menggunakan Amazon SDK for Java - Amazon S3 Glacier

Halaman ini hanya untuk pelanggan lama dari layanan S3 Glacier menggunakan Vaults dan asli dari 2012. REST API

Jika Anda mencari solusi penyimpanan arsip, kami sarankan untuk menggunakan kelas penyimpanan S3 Glacier di Amazon S3, Pengambilan Instan Gletser S3, Pengambilan Fleksibel Gletser S3, dan S3 Glacier Deep Archive. Untuk mempelajari lebih lanjut tentang opsi penyimpanan ini, lihat Kelas penyimpanan S3 Glacier dan Penyimpanan data jangka panjang menggunakan kelas penyimpanan S3 Glacier di Panduan Pengguna Amazon S3. Kelas penyimpanan ini menggunakan Amazon S3API, tersedia di semua wilayah, dan dapat dikelola dalam konsol Amazon S3. Mereka menawarkan fitur seperti Analisis Biaya Penyimpanan, Lensa Penyimpanan, fitur enkripsi opsional canggih, dan banyak lagi.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengunggah Arsip Besar dalam Beberapa Bagian Menggunakan Amazon SDK for Java

API tingkat tinggi dan tingkat rendah yang disediakan oleh Amazon SDK for Java menyediakan metode untuk mengunggah arsip besar (lihat Mengunggah Arsip di Amazon S3 Glacier).

  • API tingkat tinggi menyediakan metode yang dapat Anda gunakan untuk mengunggah arsip dalam ukuran apa pun. Bergantung pada file yang Anda unggah, metode ini mengunggah arsip dalam satu operasi atau menggunakan dukungan unggahan multipart di Amazon S3 Glacier (S3 Glacier) untuk mengunggah arsip dalam beberapa bagian.

  • API tingkat rendah hampir memetakan ke implementasi REST yang mendasarinya. Dengan demikian, ini menyediakan metode untuk mengunggah arsip yang lebih kecil dalam satu operasi dan grup metode yang mendukung unggahan multipart untuk arsip yang lebih besar. Bagian ini menjelaskan mengunggah arsip besar dalam beberapa bagian menggunakan API tingkat rendah.

Untuk informasi selengkapnya tentang API tingkat tinggi dan tingkat rendah, lihat Menggunakan AWS SDK for Java dengan Amazon S3 Glacier.

Mengunggah Arsip Besar dalam Beberapa Bagian Menggunakan API Tingkat Tinggi dari AWS SDK for Java

Anda menggunakan metode API tingkat tinggi yang sama untuk mengunggah arsip kecil atau besar. Berdasarkan ukuran arsip, metode API tingkat tinggi memutuskan apakah akan mengunggah arsip dalam satu operasi atau menggunakan API unggahan multipart yang disediakan oleh S3 Glacier. Untuk informasi selengkapnya, lihat Mengunggah Arsip Menggunakan API Tingkat Tinggi dari AWS SDK for Java.

Mengunggah Arsip Besar dalam Beberapa Bagian Menggunakan API Tingkat Rendah dari AWS SDK for Java

Untuk kontrol unggahan granular, Anda dapat menggunakan API tingkat rendah tempat Anda dapat mengonfigurasi permintaan dan memproses respons. Berikut adalah langkah-langkah untuk mengunggah arsip besar dalam beberapa bagian menggunakan AWS SDK for Java.

  1. Buat instans dari kelas AmazonGlacierClient (klien).

    Anda harus menentukan Wilayah AWS tempat Anda ingin menyimpan arsip. Semua operasi yang Anda lakukan menggunakan klien ini berlaku untuk Wilayah AWS tersebut.

  2. Mulai unggahan multipart dengan memanggil metode initiateMultipartUpload.

    Anda perlu memberi nama vault tempat Anda ingin mengunggah arsip, ukuran bagian yang ingin Anda gunakan untuk mengunggah bagian arsip, dan deskripsi opsional. Anda memberikan informasi ini dengan membuat instans kelas InitiateMultipartUploadRequest. Dalam responsnya, S3 Glacier mengembalikan ID unggahan.

  3. Unggah bagian dengan memanggil metode uploadMultipartPart.

    Untuk setiap bagian yang Anda unggah, Anda perlu memberi nama vault, rentang byte dalam gabungan arsip final yang akan diunggah di bagian ini, checksum dari data bagian, dan ID unggahan.

  4. Selesaikan unggahan multipart dengan memanggil metode completeMultipartUpload.

    Anda perlu memberikan ID unggahan, checksum dari seluruh arsip, ukuran arsip (ukuran gabungan dari semua bagian yang Anda unggah), dan nama vault. S3 Glacier menyusun arsip dari bagian yang diunggah dan mengembalikan ID arsip.

Contoh: Mengunggah Arsip Besar dalam Beberapa Bagian MenggunakanAWS SDK for Java

Contoh kode Java berikut menggunakan AWS SDK for Java untuk mengunggah arsip ke vault (examplevault). Untuk petunjuk langkah demi langkah tentang cara menjalankan contoh ini, lihat Menjalankan Contoh Java untuk Amazon S3 Glacier Menggunakan Eclipse. Anda perlu memperbarui kode seperti yang ditunjukkan dengan nama file yang ingin Anda unggah.

catatan

Contoh ini berlaku untuk ukuran bagian mulai dari 1 MB hingga 1 GB. Namun, S3 Glacier mendukung ukuran bagian hingga 4 GB.

import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Date; import java.util.LinkedList; import java.util.List; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.glacier.AmazonGlacierClient; import com.amazonaws.services.glacier.TreeHashGenerator; import com.amazonaws.services.glacier.model.CompleteMultipartUploadRequest; import com.amazonaws.services.glacier.model.CompleteMultipartUploadResult; import com.amazonaws.services.glacier.model.InitiateMultipartUploadRequest; import com.amazonaws.services.glacier.model.InitiateMultipartUploadResult; import com.amazonaws.services.glacier.model.UploadMultipartPartRequest; import com.amazonaws.services.glacier.model.UploadMultipartPartResult; import com.amazonaws.util.BinaryUtils; public class ArchiveMPU { public static String vaultName = "examplevault"; // This example works for part sizes up to 1 GB. public static String partSize = "1048576"; // 1 MB. public static String archiveFilePath = "*** provide archive file path ***"; public static AmazonGlacierClient client; public static void main(String[] args) throws IOException { ProfileCredentialsProvider credentials = new ProfileCredentialsProvider(); client = new AmazonGlacierClient(credentials); client.setEndpoint("https://glacier.us-west-2.amazonaws.com/"); try { System.out.println("Uploading an archive."); String uploadId = initiateMultipartUpload(); String checksum = uploadParts(uploadId); String archiveId = CompleteMultiPartUpload(uploadId, checksum); System.out.println("Completed an archive. ArchiveId: " + archiveId); } catch (Exception e) { System.err.println(e); } } private static String initiateMultipartUpload() { // Initiate InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest() .withVaultName(vaultName) .withArchiveDescription("my archive " + (new Date())) .withPartSize(partSize); InitiateMultipartUploadResult result = client.initiateMultipartUpload(request); System.out.println("ArchiveID: " + result.getUploadId()); return result.getUploadId(); } private static String uploadParts(String uploadId) throws AmazonServiceException, NoSuchAlgorithmException, AmazonClientException, IOException { int filePosition = 0; long currentPosition = 0; byte[] buffer = new byte[Integer.valueOf(partSize)]; List<byte[]> binaryChecksums = new LinkedList<byte[]>(); File file = new File(archiveFilePath); FileInputStream fileToUpload = new FileInputStream(file); String contentRange; int read = 0; while (currentPosition < file.length()) { read = fileToUpload.read(buffer, filePosition, buffer.length); if (read == -1) { break; } byte[] bytesRead = Arrays.copyOf(buffer, read); contentRange = String.format("bytes %s-%s/*", currentPosition, currentPosition + read - 1); String checksum = TreeHashGenerator.calculateTreeHash(new ByteArrayInputStream(bytesRead)); byte[] binaryChecksum = BinaryUtils.fromHex(checksum); binaryChecksums.add(binaryChecksum); System.out.println(contentRange); //Upload part. UploadMultipartPartRequest partRequest = new UploadMultipartPartRequest() .withVaultName(vaultName) .withBody(new ByteArrayInputStream(bytesRead)) .withChecksum(checksum) .withRange(contentRange) .withUploadId(uploadId); UploadMultipartPartResult partResult = client.uploadMultipartPart(partRequest); System.out.println("Part uploaded, checksum: " + partResult.getChecksum()); currentPosition = currentPosition + read; } fileToUpload.close(); String checksum = TreeHashGenerator.calculateTreeHash(binaryChecksums); return checksum; } private static String CompleteMultiPartUpload(String uploadId, String checksum) throws NoSuchAlgorithmException, IOException { File file = new File(archiveFilePath); CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest() .withVaultName(vaultName) .withUploadId(uploadId) .withChecksum(checksum) .withArchiveSize(String.valueOf(file.length())); CompleteMultipartUploadResult compResult = client.completeMultipartUpload(compRequest); return compResult.getLocation(); } }