Topik ini menjelaskan cara menyalin objek dalam satu bucket atau antar-bucket di wilayah yang sama.
Perhatian
Untuk menyalin file, Anda harus memiliki izin baca pada file sumber serta izin baca dan tulis pada bucket tujuan.
Penyalinan lintas wilayah tidak didukung. Misalnya, Anda tidak dapat menyalin file dari bucket di wilayah China (Hangzhou) ke bucket di wilayah China (Qingdao).
Ukuran file yang akan disalin tidak boleh melebihi 1 GB.
Sebelum menjalankan kode contoh dalam topik ini, Anda harus membuat instans OSSClient dengan menggunakan metode seperti nama domain kustom atau Security Token Service (STS). Untuk informasi selengkapnya, lihat Inisialisasi (Android SDK).
Izin
Secara default, Akun Alibaba Cloud memiliki izin penuh. Pengguna RAM atau Peran RAM di bawah Akun Alibaba Cloud tidak memiliki izin apa pun secara default. Akun Alibaba Cloud atau administrator akun harus memberikan izin operasi melalui Kebijakan RAM atau Kebijakan bucket.
API | Action | Definisi |
CopyObject |
| Menyalin objek dalam satu bucket atau antar-bucket di wilayah yang sama. |
| ||
| Jika Anda menentukan versi objek sumber melalui versionId, izin ini juga diperlukan. | |
| Jika Anda menyalin tag objek melalui x-oss-tagging, izin-izin ini diperlukan. | |
| ||
| Jika Anda menentukan tag untuk versi tertentu dari objek sumber melalui versionId, izin ini juga diperlukan. | |
| Saat menyalin objek, jika metadata objek tujuan berisi X-Oss-Server-Side-Encryption: KMS, kedua izin ini diperlukan. | |
|
Kode contoh
Kode berikut menunjukkan cara menyalin file:
// Tentukan nama bucket sumber.
String srcBucketName = "src-bucket";
// Tentukan path lengkap objek di bucket sumber.
String srcObjectKey = "dir1/source-object.txt";
// Tentukan nama bucket tujuan, yang harus berada di wilayah yang sama dengan bucket sumber.
String destBucketName = "dest-bucket";
// Tentukan path lengkap objek di bucket tujuan.
String destObjectKey = "dir2/destination-object.txt";
// Buat permintaan salin.
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcObjectKey, destBucketName, destObjectKey);
// ObjectMetadata objectMetadata = new ObjectMetadata();
// Atur daftar kontrol akses (ACL) objek. Dalam contoh ini, ACL diatur ke private.
// objectMetadata.setHeader("x-oss-object-acl", "private");
// Atur kelas penyimpanan objek. Dalam contoh ini, kelas penyimpanan diatur ke Standard.
// objectMetadata.setHeader("x-oss-storage-class", "Standard");
// Tentukan apakah objek yang sudah ada dengan nama yang sama di bucket tujuan akan ditimpa. Dalam contoh ini, nilai diatur ke true, yang berarti objek yang ada tidak dapat ditimpa.
// objectMetadata.setHeader("x-oss-forbid-overwrite", "true");
// Operasi salin hanya dilakukan jika ETag objek sumber sesuai dengan ETag yang ditentukan.
// objectMetadata.setHeader("x-oss-copy-source-if-match", "5B3C1A2E053D763E1B002CC607C5****");
// Tentukan alamat sumber untuk operasi salin.
// objectMetadata.setHeader("x-oss-copy-source", "/example-bucket/recode-test.txt");
// Operasi salin hanya dilakukan jika ETag objek sumber tidak sesuai dengan ETag yang ditentukan.
// objectMetadata.setHeader("x-oss-copy-source-if-none-match", "5B3C1A2E053D763E1B002CC607C5****");
// Operasi salin hanya dilakukan jika waktu modifikasi aktual objek lebih awal dari atau sama dengan waktu yang ditentukan.
// objectMetadata.setHeader("x-oss-copy-source-if-unmodified-since", "2021-12-09T07:01:56.000Z");
// Operasi salin hanya dilakukan jika objek sumber dimodifikasi setelah waktu yang ditentukan.
// objectMetadata.setHeader("x-oss-copy-source-if-modified-since", "2021-12-09T07:01:56.000Z");
// Tentukan cara mengonfigurasi metadata objek tujuan. Dalam contoh ini, nilai diatur ke COPY, yang berarti metadata objek sumber disalin ke objek tujuan.
// objectMetadata.setHeader("x-oss-metadata-directive", "COPY");
// Tentukan algoritma enkripsi sisi server yang digunakan OSS untuk membuat objek tujuan.
// objectMetadata.setHeader("x-oss-server-side-encryption", "SSE-KMS");
// Kunci master pelanggan (CMK) yang dikelola oleh KMS. Parameter ini hanya berlaku ketika x-oss-server-side-encryption diatur ke KMS.
// objectMetadata.setHeader("x-oss-server-side-encryption-key-id", "9468da86-3509-4f8d-a61e-6eab1eac****");
// Tentukan tag objek. Anda dapat menentukan beberapa tag sekaligus.
// objectMetadata.setHeader("x-oss-tagging", "a:1");
// Tentukan cara mengonfigurasi tag objek tujuan. Dalam contoh ini, nilai diatur ke COPY, yang berarti tag objek sumber disalin ke objek tujuan.
// objectMetadata.setHeader("x-oss-tagging-directive", "COPY");
// Lakukan salinan asinkron.
OSSAsyncTask copyTask = oss.asyncCopyObject(copyObjectRequest, new OSSCompletedCallback<CopyObjectRequest, CopyObjectResult>() {
@Override
public void onSuccess(CopyObjectRequest request, CopyObjectResult result) {
Log.d("copyObject", "copy success!");
}
@Override
public void onFailure(CopyObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// Permintaan gagal.
if (clientExcepion != null) {
// Terjadi exception pada client, seperti exception jaringan.
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// Terjadi exception pada sisi server.
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});Referensi
Untuk kode contoh lengkap tentang penyalinan file, lihat contoh di GitHub.
Untuk informasi mengenai operasi API untuk menyalin file, lihat CopyObject.
Untuk informasi mengenai cara menginisialisasi instans OSSClient, lihat Inisialisasi instans OSSClient untuk Android.