全部产品
Search
文档中心

Object Storage Service:Mencegah objek dengan nama yang sama ditimpa (Android SDK)

更新时间:Nov 30, 2025

Secara default, mengunggah objek dengan nama yang sama seperti objek yang sudah ada akan menimpa objek tersebut jika Anda memiliki izin akses yang diperlukan. Topik ini menjelaskan cara mengatur header permintaan x-oss-forbid-overwrite untuk mencegah penimpaan objek dalam skenario seperti unggah simple, copy objek, dan unggah multi-bagian.

Catatan Penggunaan

  • Sebelum menjalankan kode contoh dalam topik ini, Anda harus membuat instans OSSClient melalui metode seperti menggunakan nama domain kustom atau Security Token Service (STS). Untuk informasi selengkapnya, lihat Initialization (Android SDK).

Simple Upload

Kode contoh berikut menunjukkan cara mencegah objek yang sudah ada ditimpa oleh objek dengan nama yang sama saat melakukan unggah simple:

// Masukkan nama bucket. Contoh: examplebucket. Untuk informasi lebih lanjut tentang konvensi penamaan bucket, lihat Buckets.
String bucketName = "examplebucket";
// Masukkan path lengkap objek. Jangan sertakan nama bucket. Contoh: exampledir/exampleobject.txt. Untuk informasi lebih lanjut tentang konvensi penamaan objek, lihat Objects.
String objectKey = "exampledir/exampleobject.txt";
// Masukkan path lengkap file lokal yang akan diunggah.
String localFile = "/storage/emulated/0/oss/examplefile.txt";
// Buat permintaan unggah.
PutObjectRequest put = new PutObjectRequest(bucketName, objectKey, localFile);
ObjectMetadata metadata = new ObjectMetadata();

// Tentukan apakah objek dengan nama yang sama boleh ditimpa selama proses unggah.
// Jika Anda tidak menentukan x-oss-forbid-overwrite, objek dengan nama yang sama akan ditimpa secara default.
// Jika Anda mengatur x-oss-forbid-overwrite ke false, objek dengan nama yang sama akan ditimpa.
// Jika Anda mengatur x-oss-forbid-overwrite ke true, objek dengan nama yang sama tidak akan ditimpa. Jika objek dengan nama yang sama sudah ada, program akan melaporkan error.
metadata.setHeader("x-oss-forbid-overwrite", "true");
put.setMetadata(metadata);

OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
    @Override
    public void onSuccess(PutObjectRequest request, PutObjectResult result) {
        Log.d("PutObject", "UploadSuccess");
        Log.d("ETag", result.getETag());
        Log.d("RequestId", result.getRequestId());
    }

    @Override
    public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
        // Permintaan gagal.
        if (clientExcepion != null) {
            // Terjadi exception pada client, seperti error 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());
        }
    }
});

Copying files

Kode contoh berikut menunjukkan cara mencegah objek yang sudah ada di bucket ditimpa oleh objek dengan nama yang sama dalam tugas copy objek:

// Masukkan nama bucket sumber.
String srcBucketName = "srcbucket";
// Masukkan path lengkap objek sumber di dalam bucket.
String srcObjectKey = "dir1/srcobject.txt";
// Masukkan nama bucket tujuan.
String destBucketName = "destbucket";
// Masukkan path lengkap objek tujuan di dalam bucket.
String destObjectKey = "dir2/destobject.txt";
// Buat permintaan copy.
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcObjectKey, destBucketName, destObjectKey);

ObjectMetadata metadata = new ObjectMetadata();

// Tentukan apakah objek dengan nama yang sama boleh ditimpa selama operasi copy.
// Jika Anda tidak menentukan x-oss-forbid-overwrite, objek dengan nama yang sama akan ditimpa secara default.
// Jika Anda mengatur x-oss-forbid-overwrite ke false, objek dengan nama yang sama akan ditimpa.
// Jika Anda mengatur x-oss-forbid-overwrite ke true, objek dengan nama yang sama tidak akan ditimpa. Jika objek dengan nama yang sama sudah ada, program akan melaporkan error.
metadata.setHeader("x-oss-forbid-overwrite", "true");
copyObjectRequest.setNewObjectMetadata(metadata);

// Copy objek secara 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 error jaringan.
            clientExcepion.printStackTrace();
        }
        if (serviceException != null) {
            // Terjadi exception layanan.
            Log.e("ErrorCode", serviceException.getErrorCode());
            Log.e("RequestId", serviceException.getRequestId());
            Log.e("HostId", serviceException.getHostId());
            Log.e("RawMessage", serviceException.getRawMessage());
        }
    }
});

Multipart Upload

Kode contoh berikut menunjukkan cara mencegah objek yang sudah ada ditimpa saat Anda menggunakan unggah multi-bagian untuk mengunggah objek dengan nama yang sama:

// Masukkan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Masukkan path lengkap objek. Jangan sertakan nama bucket. Contoh: exampledir/exampleobject.txt.
String objectKey = "exampledir/exampleobject.txt";
// Masukkan path lengkap file lokal yang akan diunggah.
String localFile = "/storage/emulated/0/oss/examplefile.txt";

// Inisialisasi unggah multi-bagian.
InitiateMultipartUploadRequest init = new InitiateMultipartUploadRequest(bucketName, objectKey);
ObjectMetadata metadata = new ObjectMetadata();
// Tentukan apakah objek dengan nama yang sama boleh ditimpa selama proses unggah.
// Jika Anda tidak menentukan x-oss-forbid-overwrite, objek dengan nama yang sama akan ditimpa secara default.
// Jika Anda mengatur x-oss-forbid-overwrite ke false, objek dengan nama yang sama akan ditimpa.
// Jika Anda mengatur x-oss-forbid-overwrite ke true, objek dengan nama yang sama tidak akan ditimpa. Jika objek dengan nama yang sama sudah ada, program akan melaporkan error.
metadata.setHeader("x-oss-forbid-overwrite", "true");
init.setMetadata(metadata);

InitiateMultipartUploadResult initResult = oss.initMultipartUpload(init);
// uploadId dikembalikan. uploadId adalah pengidentifikasi unik untuk event unggah multi-bagian. Anda dapat menggunakan uploadId ini untuk melakukan operasi terkait, seperti membatalkan atau mengkueri unggah multi-bagian.
String uploadId = initResult.getUploadId();

// Atur ukuran satu bagian dalam byte. Nilainya harus berada dalam rentang 100 KB hingga 5 GB.
int partCount = 100 * 1024;
// Unggah bagian-bagian.
List<PartETag> partETags = new ArrayList<PartETag>();
for (int i = 1; i < 5; i++) {
    byte[] data = new byte[partCount];

    RandomAccessFile raf = new RandomAccessFile(localFile, "r");
    long skip = (i-1) * partCount;
    raf.seek(skip);
    raf.readFully(data, 0, partCount);

    UploadPartRequest uploadPart = new UploadPartRequest();
    uploadPart.setBucketName(bucketName);
    uploadPart.setObjectKey(objectKey);
    uploadPart.setUploadId(uploadId);
    // Atur nomor bagian. Nomor bagian dimulai dari 1. Setiap bagian yang diunggah memiliki nomor bagian. Nilainya harus berada dalam rentang 1 hingga 10.000.
    uploadPart.setPartNumber(i);
    uploadPart.setPartContent(data);
    try {
        UploadPartResult result = oss.uploadPart(uploadPart);
        PartETag partETag = new PartETag(uploadPart.getPartNumber(), result.getETag());
        partETags.add(partETag);
    } catch (ServiceException serviceException) {
        OSSLog.logError(serviceException.getErrorCode());
    }
}
Collections.sort(partETags, new Comparator<PartETag>() {
    @Override
    public int compare(PartETag lhs, PartETag rhs) {
        if (lhs.getPartNumber() < rhs.getPartNumber()) {
            return -1;
        } else if (lhs.getPartNumber() > rhs.getPartNumber()) {
            return 1;
        } else {
            return 0;
        }
    }
});

// Selesaikan unggah multi-bagian.
CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest(bucketName, objectKey, uploadId, partETags);
metadata = new ObjectMetadata();
// Tentukan apakah objek dengan nama yang sama boleh ditimpa saat menyelesaikan unggah.
// Jika Anda tidak menentukan x-oss-forbid-overwrite, objek dengan nama yang sama akan ditimpa secara default.
// Jika Anda mengatur x-oss-forbid-overwrite ke false, objek dengan nama yang sama akan ditimpa.
// Jika Anda mengatur x-oss-forbid-overwrite ke true, objek dengan nama yang sama tidak akan ditimpa. Jika objek dengan nama yang sama sudah ada, program akan melaporkan error.
metadata.setHeader("x-oss-forbid-overwrite", "true");
complete.setMetadata(metadata);
CompleteMultipartUploadResult completeResult = oss.completeMultipartUpload(complete);           

Referensi

  • Untuk informasi selengkapnya tentang Operasi API yang dapat Anda panggil untuk melakukan unggah simple, lihat PutObject.

  • Untuk informasi selengkapnya tentang Operasi API yang dapat Anda panggil untuk menyalin objek, lihat CopyObject.

  • Untuk informasi selengkapnya tentang cara menginisialisasi instans OSSClient, lihat Initialization.

  • Unggah multi-bagian melibatkan tiga Operasi API. Untuk informasi selengkapnya tentang operasi tersebut, lihat topik berikut:

    • Untuk deskripsi Operasi API guna menginisialisasi unggah multi-bagian, lihat InitiateMultipartUpload.

    • Untuk informasi selengkapnya tentang Operasi API untuk mengunggah satu Part dari unggah multi-bagian, lihat UploadPart.

    • Untuk informasi selengkapnya tentang Operasi API untuk menyelesaikan unggah multi-bagian, lihat CompleteMultipartUpload.