Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menyalin objek menggunakan unggahan multibagian
Unggahan multipart memungkinkan Anda menyalin objek sebagai satu set bagian. Contoh di bagian ini menunjukkan cara menyalin objek yang lebih besar dari 5 GB menggunakan API unggahan multipart. Untuk informasi tentang unggahan multibagian, lihat. Mengunggah dan menyalin objek menggunakan unggahan multibagian
Anda dapat menyalin objek kurang dari 5 GB dalam satu operasi tanpa menggunakan API unggahan multipart. Anda dapat menyalin objek kurang dari 5 GB menggunakan AWS Management Console, AWS CLI, RESTAPI, atau AWS SDKs. Untuk informasi selengkapnya, lihat Menyalin, memindahkan, dan mengganti nama objek.
Untuk end-to-end prosedur mengunggah objek dengan unggahan multipart dengan checksum tambahan, lihat. Tutorial: Unggah objek melalui unggahan multipart dan verifikasi integritas datanya
Bagian berikut menunjukkan cara menyalin objek dengan upload multipart dengan REST API atau AWS SDKs.
Bagian berikut dalam APIReferensi Layanan Penyimpanan Sederhana Amazon menjelaskan REST API untuk upload multipart. Untuk menyalin objek yang ada, gunakan Upload Part (Copy) API dan tentukan objek sumber dengan menambahkan header x-amz-copy-source
permintaan dalam permintaan Anda.
Anda dapat menggunakan ini APIs untuk membuat REST permintaan Anda sendiri, atau Anda dapat menggunakan salah satu yang SDKs kami sediakan. Untuk informasi selengkapnya tentang menggunakan Unggahan Multipart dengan AWS CLI, lihatMenggunakan AWS CLI. Untuk informasi lebih lanjut tentangSDKs, lihatAWS SDK support untuk unggahan multibagian.
Untuk menyalin objek menggunakan level rendahAPI, lakukan hal berikut:
-
Mulai unggahan multibagian dengan memanggil metode AmazonS3Client.initiateMultipartUpload()
.
-
Simpan ID unggahan dari objek respons yang dikembalikan oleh metode AmazonS3Client.initiateMultipartUpload()
. Anda memberikan ID unggahan ini untuk setiap operasi unggahan bagian.
-
Salin semua bagiannya. Untuk setiap bagian yang harus Anda salin, buat sebuah instans baru dari kelas CopyPartRequest
. Berikan informasi bagian, termasuk nama bucket sumber dan tujuan, kunci objek sumber dan tujuan, ID unggahan, lokasi byte pertama dan terakhir bagian tersebut, dan nomor bagian.
-
Simpan respons dari panggilan metode AmazonS3Client.copyPart()
. Setiap respons mencakup nilai ETag
dan nomor bagian untuk bagian yang diunggah. Anda memerlukan informasi ini untuk menyelesaikan unggahan multibagian.
-
Perintahkan metode AmazonS3Client.completeMultipartUpload()
untuk menyelesaikan operasi penyalinan.
- Java
-
Contoh berikut menunjukkan cara menggunakan Amazon S3 tingkat rendah Java API untuk melakukan salinan multipart. Untuk petunjuk cara membuat dan menguji sampel yang berfungsi, lihat Memulai di Panduan AWS SDK for Java Pengembang.
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class LowLevelMultipartCopy {
public static void main(String[] args) throws IOException {
Regions clientRegion = Regions.DEFAULT_REGION;
String sourceBucketName = "*** Source bucket name ***";
String sourceObjectKey = "*** Source object key ***";
String destBucketName = "*** Target bucket name ***";
String destObjectKey = "*** Target object key ***";
try {
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new ProfileCredentialsProvider())
.withRegion(clientRegion)
.build();
// Initiate the multipart upload.
InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(destBucketName,
destObjectKey);
InitiateMultipartUploadResult initResult = s3Client.initiateMultipartUpload(initRequest);
// Get the object size to track the end of the copy operation.
GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(sourceBucketName, sourceObjectKey);
ObjectMetadata metadataResult = s3Client.getObjectMetadata(metadataRequest);
long objectSize = metadataResult.getContentLength();
// Copy the object using 5 MB parts.
long partSize = 5 * 1024 * 1024;
long bytePosition = 0;
int partNum = 1;
List<CopyPartResult> copyResponses = new ArrayList<CopyPartResult>();
while (bytePosition < objectSize) {
// The last part might be smaller than partSize, so check to make sure
// that lastByte isn't beyond the end of the object.
long lastByte = Math.min(bytePosition + partSize - 1, objectSize - 1);
// Copy this part.
CopyPartRequest copyRequest = new CopyPartRequest()
.withSourceBucketName(sourceBucketName)
.withSourceKey(sourceObjectKey)
.withDestinationBucketName(destBucketName)
.withDestinationKey(destObjectKey)
.withUploadId(initResult.getUploadId())
.withFirstByte(bytePosition)
.withLastByte(lastByte)
.withPartNumber(partNum++);
copyResponses.add(s3Client.copyPart(copyRequest));
bytePosition += partSize;
}
// Complete the upload request to concatenate all uploaded parts and make the
// copied object available.
CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(
destBucketName,
destObjectKey,
initResult.getUploadId(),
getETags(copyResponses));
s3Client.completeMultipartUpload(completeRequest);
System.out.println("Multipart copy complete.");
} catch (AmazonServiceException e) {
// The call was transmitted successfully, but Amazon S3 couldn't process
// it, so it returned an error response.
e.printStackTrace();
} catch (SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
e.printStackTrace();
}
}
// This is a helper function to construct a list of ETags.
private static List<PartETag> getETags(List<CopyPartResult> responses) {
List<PartETag> etags = new ArrayList<PartETag>();
for (CopyPartResult response : responses) {
etags.add(new PartETag(response.getPartNumber(), response.getETag()));
}
return etags;
}
}
- .NET
-
Contoh C # berikut menunjukkan cara menggunakan AWS SDK for .NET untuk menyalin objek Amazon S3 yang lebih besar dari 5 GB dari satu lokasi sumber ke lokasi lain, seperti dari satu bucket ke bucket lainnya. Untuk menyalin objek yang lebih kecil dari 5 GB, gunakan prosedur penyalinan operasi tunggal yang dijelaskan dalam Menggunakan AWS SDKs. Untuk informasi selengkapnya tentang unggahan multibagian Amazon S3, lihat Mengunggah dan menyalin objek menggunakan unggahan multibagian.
Contoh ini menunjukkan cara menyalin objek Amazon S3 yang lebih besar dari 5 GB dari satu bucket S3 ke bucket lainnya menggunakan unggahan multipart. AWS SDK for .NET API
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Amazon.DocSamples.S3
{
class CopyObjectUsingMPUapiTest
{
private const string sourceBucket = "*** provide the name of the bucket with source object ***";
private const string targetBucket = "*** provide the name of the bucket to copy the object to ***";
private const string sourceObjectKey = "*** provide the name of object to copy ***";
private const string targetObjectKey = "*** provide the name of the object copy ***";
// Specify your bucket region (an example region is shown).
private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
private static IAmazonS3 s3Client;
public static void Main()
{
s3Client = new AmazonS3Client(bucketRegion);
Console.WriteLine("Copying an object");
MPUCopyObjectAsync().Wait();
}
private static async Task MPUCopyObjectAsync()
{
// Create a list to store the upload part responses.
List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();
List<CopyPartResponse> copyResponses = new List<CopyPartResponse>();
// Setup information required to initiate the multipart upload.
InitiateMultipartUploadRequest initiateRequest =
new InitiateMultipartUploadRequest
{
BucketName = targetBucket,
Key = targetObjectKey
};
// Initiate the upload.
InitiateMultipartUploadResponse initResponse =
await s3Client.InitiateMultipartUploadAsync(initiateRequest);
// Save the upload ID.
String uploadId = initResponse.UploadId;
try
{
// Get the size of the object.
GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest
{
BucketName = sourceBucket,
Key = sourceObjectKey
};
GetObjectMetadataResponse metadataResponse =
await s3Client.GetObjectMetadataAsync(metadataRequest);
long objectSize = metadataResponse.ContentLength; // Length in bytes.
// Copy the parts.
long partSize = 5 * (long)Math.Pow(2, 20); // Part size is 5 MB.
long bytePosition = 0;
for (int i = 1; bytePosition < objectSize; i++)
{
CopyPartRequest copyRequest = new CopyPartRequest
{
DestinationBucket = targetBucket,
DestinationKey = targetObjectKey,
SourceBucket = sourceBucket,
SourceKey = sourceObjectKey,
UploadId = uploadId,
FirstByte = bytePosition,
LastByte = bytePosition + partSize - 1 >= objectSize ? objectSize - 1 : bytePosition + partSize - 1,
PartNumber = i
};
copyResponses.Add(await s3Client.CopyPartAsync(copyRequest));
bytePosition += partSize;
}
// Set up to complete the copy.
CompleteMultipartUploadRequest completeRequest =
new CompleteMultipartUploadRequest
{
BucketName = targetBucket,
Key = targetObjectKey,
UploadId = initResponse.UploadId
};
completeRequest.AddPartETags(copyResponses);
// Complete the copy.
CompleteMultipartUploadResponse completeUploadResponse =
await s3Client.CompleteMultipartUploadAsync(completeRequest);
}
catch (AmazonS3Exception e)
{
Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
}
catch (Exception e)
{
Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
}
}
}
}