Unggah append menggunakan metode AppendObject untuk menambahkan konten ke akhir objek yang dapat ditambahkan yang sudah ada.
Catatan
Topik ini menggunakan titik akhir publik wilayah China (Hangzhou). Untuk mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal. Untuk detail wilayah dan titik akhir yang didukung, lihat Wilayah dan titik akhir.
Topik ini memperoleh kredensial akses dari variabel lingkungan. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi kredensial akses.
Topik ini membuat instans OSSClient menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Contoh konfigurasi untuk skenario umum.
Jika file tidak ada, pemanggilan operasi API AppendObject akan membuat objek yang dapat ditambahkan.
Jika file sudah ada:
Jika file tersebut merupakan objek yang dapat ditambahkan dan posisi append yang ditentukan sama dengan panjang file saat ini, konten akan ditambahkan ke akhir file.
Jika file tersebut merupakan objek yang dapat ditambahkan tetapi posisi append yang ditentukan tidak sama dengan panjang file saat ini, eksepsi PositionNotEqualToLength akan dilemparkan.
Jika file tersebut bukan objek yang dapat ditambahkan, misalnya objek Normal yang diunggah melalui unggah simple, eksepsi ObjectNotAppendable akan dilemparkan.
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 | Aksi | Definisi |
AppendObject |
| Anda dapat memanggil operasi ini untuk mengunggah objek dengan menambahkannya ke objek yang sudah ada. |
| Saat mengunggah objek dengan menambahkannya ke objek yang sudah ada, jika Anda menentukan tag objek melalui x-oss-tagging, izin ini diperlukan. |
Kode contoh
Kode berikut menunjukkan cara menambahkan data ke objek.
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.AppendObjectRequest;
import com.aliyun.oss.model.AppendObjectResult;
import com.aliyun.oss.model.ObjectMetadata;
import java.io.ByteArrayInputStream;
public class Demo {
public static void main(String[] args) throws Exception {
// Tetapkan Endpoint. Contoh: China (Hangzhou). Sesuaikan nilainya sesuai kebutuhan.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Contoh: exampledir/exampleobject.txt.
String objectName = "exampledir/exampleobject.txt";
String content1 = "Hello OSS A \n";
String content2 = "Hello OSS B \n";
String content3 = "Hello OSS C \n";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou.
String region = "cn-hangzhou";
// Buat instans OSSClient.
// Setelah instans OSSClient tidak digunakan lagi, panggil metode shutdown untuk melepaskan sumber daya.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
ObjectMetadata meta = new ObjectMetadata();
// Tentukan tipe konten.
meta.setContentType("text/plain");
// Tentukan perilaku caching halaman web untuk objek.
//meta.setCacheControl("no-cache");
// Tentukan nama objek saat diunduh.
//meta.setContentDisposition("attachment;filename=oss_download.txt");
// Tentukan format encoding konten objek.
//meta.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
// Header permintaan ini digunakan untuk memeriksa apakah konten pesan konsisten dengan konten yang dikirim.
//meta.setContentMD5("ohhnqLBJFiKkPSBO1eNaUA==");
// Tentukan waktu kedaluwarsa.
//try {
// meta.setExpirationTime(DateUtil.parseRfc822Date("Wed, 08 Jul 2022 16:57:01 GMT"));
//} catch (ParseException e) {
// e.printStackTrace();
//}
// Tentukan metode enkripsi sisi server. Pada contoh ini, digunakan enkripsi sisi server dengan kunci yang dikelola OSS (SSE-OSS).
//meta.setServerSideEncryption(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
// Tentukan izin akses objek. Pada contoh ini, izin akses diatur ke private.
//meta.setObjectAcl(CannedAccessControlList.Private);
// Tentukan kelas penyimpanan objek.
//meta.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);
// Anda dapat menambahkan x-oss-meta-* saat membuat objek yang dapat ditambahkan. Parameter ini tidak boleh disertakan pada append berikutnya. Jika Anda mengonfigurasi parameter dengan awalan x-oss-meta-*, parameter tersebut dianggap sebagai metadata.
//meta.setHeader("x-oss-meta-author", "Alice");
// Atur beberapa parameter menggunakan AppendObjectRequest.
AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucketName, objectName, new ByteArrayInputStream(content1.getBytes()),meta);
// Atur satu parameter menggunakan AppendObjectRequest.
// Tetapkan nama bucket.
//appendObjectRequest.setBucketName(bucketName);
// Tetapkan nama objek.
//appendObjectRequest.setKey(objectName);
// Tetapkan konten yang akan ditambahkan. Konten dapat bertipe InputStream atau File. Pada contoh ini, konten bertipe InputStream.
//appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
// Tetapkan konten yang akan ditambahkan. Konten dapat bertipe InputStream atau File. Pada contoh ini, konten bertipe File.
//appendObjectRequest.setFile(new File("D:\\localpath\\examplefile.txt"));
// Tentukan metadata file. Ini hanya berlaku untuk append pertama.
//appendObjectRequest.setMetadata(meta);
// Append pertama.
// Tetapkan posisi append file.
appendObjectRequest.setPosition(0L);
AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
// Nilai CRC 64-bit file.
System.out.println(appendObjectResult.getObjectCRC());
// Append kedua.
// nextPosition menunjukkan posisi yang harus diberikan dalam permintaan berikutnya, yaitu panjang file saat ini.
appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes()));
appendObjectResult = ossClient.appendObject(appendObjectRequest);
// Append ketiga.
appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
appendObjectRequest.setInputStream(new ByteArrayInputStream(content3.getBytes()));
appendObjectResult = ossClient.appendObject(appendObjectRequest);
} catch (OSSException oe) {
System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
+ "tetapi ditolak dengan tanggapan error karena suatu alasan.");
System.out.println("Pesan Error:" + oe.getErrorMessage());
System.out.println("Kode Error:" + oe.getErrorCode());
System.out.println("ID Permintaan:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Terjadi ClientException, yang berarti klien mengalami "
+ "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
+ "seperti tidak dapat mengakses jaringan.");
System.out.println("Pesan Error:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}Referensi
Untuk kode contoh lengkap unggah append, lihat Contoh GitHub.
Untuk informasi selengkapnya tentang operasi API unggah append, lihat AppendObject.