All Products
Search
Document Center

Object Storage Service:Mencegah penimpaan objek yang memiliki nama sama (iOS SDK)

Last Updated: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 unggah simple, copy objek, dan unggah multi-bagian.

Catatan penggunaan

  • Sebelum menggunakan kode contoh dalam topik ini, buat instans OSSClient menggunakan nama domain kustom, Security Token Service (STS), atau metode lainnya. Untuk informasi selengkapnya, lihat Inisialisasi (iOS SDK).

Unggah simple

Kode berikut menunjukkan cara mencegah objek dengan nama yang sama ditimpa selama unggah simple:

OSSPutObjectRequest * put = [OSSPutObjectRequest new];

// Tentukan nama bucket. Contoh: examplebucket. Untuk informasi selengkapnya tentang konvensi penamaan bucket, lihat Konvensi penamaan bucket.
put.bucketName = @"examplebucket";
// Tentukan path lengkap objek. Jangan sertakan nama bucket. Contoh: exampledir/exampleobject.txt. Untuk informasi selengkapnya tentang konvensi penamaan objek, lihat Konvensi penamaan objek.
put.objectKey = @"exampledir/exampleobject.txt";
// Tentukan path lengkap file lokal yang akan diunggah.
put.uploadingFileURL = [NSURL fileURLWithPath:@"/storage/emulated/0/oss/examplefile.txt"];

// Tentukan apakah objek yang sudah ada dengan nama yang sama boleh ditimpa.
// Jika Anda tidak menentukan x-oss-forbid-overwrite, objek yang sudah ada dengan nama yang sama akan ditimpa secara default.
// Jika Anda mengatur x-oss-forbid-overwrite ke false, objek yang sudah ada dengan nama yang sama akan ditimpa.
// Jika Anda mengatur x-oss-forbid-overwrite ke true, objek yang sudah ada dengan nama yang sama tidak akan ditimpa. Jika objek dengan nama yang sama sudah ada, program akan melaporkan error.
put.objectMeta = @{@"x-oss-forbid-overwrite": @"true"};

// Opsional. Atur progres unggah.
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
    // Jumlah byte yang telah dikirim saat ini, jumlah total byte yang telah dikirim, dan jumlah total byte yang akan dikirim.
    NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
OSSTask * putTask = [client putObject:put];
[putTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"upload object success!");
    } else {
        NSLog(@"upload object failed, error: %@" , task.error);
    }
    return nil;
}];
// Blokir thread saat ini untuk menunggu tugas selesai.
// [putTask waitUntilFinished];

Menyalin file

Kode berikut menunjukkan cara mencegah objek yang sudah ada ditimpa saat Anda menyalin objek:

OSSCopyObjectRequest * copy = [OSSCopyObjectRequest new];
// Tentukan nama bucket sumber.
copy.sourceBucketName = @"srcbucket";
// Tentukan path lengkap objek sumber.
copy.sourceObjectKey = @"dir1/srcobject.txt";
// Tentukan nama bucket tujuan.
copy.bucketName = @"destbucket";
// Tentukan path lengkap objek tujuan.
copy.objectKey = @"dir2/destobject.txt";

// Tentukan apakah objek yang sudah ada dengan nama yang sama boleh ditimpa.
// Jika Anda tidak menentukan x-oss-forbid-overwrite, objek yang sudah ada dengan nama yang sama akan ditimpa secara default.
// Jika Anda mengatur x-oss-forbid-overwrite ke false, objek yang sudah ada dengan nama yang sama akan ditimpa.
// Jika Anda mengatur x-oss-forbid-overwrite ke true, objek yang sudah ada dengan nama yang sama tidak akan ditimpa. Jika objek dengan nama yang sama sudah ada, program akan melaporkan error.
copy.objectMeta = @{@"x-oss-forbid-overwrite": @"true"};

OSSTask * task = [client copyObject:copy];
[task continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"copy object success!");
    } else {
        NSLog(@"copy object failed, error: %@" , task.error);
    }
    return nil;
}];
// Blokir thread saat ini untuk menunggu tugas selesai.
// [putTask waitUntilFinished];

Unggah multi-bagian

Kode berikut menunjukkan cara mencegah objek dengan nama yang sama ditimpa selama unggah multi-bagian:

__block NSString * uploadId = nil;
__block NSMutableArray * partInfos = [NSMutableArray new];
// Tentukan nama bucket. Contoh: examplebucket.
NSString * uploadToBucket = @"examplebucket";
// Tentukan path lengkap objek. Jangan sertakan nama bucket. Contoh: exampledir/exampleobject.txt.
NSString * uploadObjectkey = @"exampledir/exampleobject.txt";
OSSInitMultipartUploadRequest * init = [OSSInitMultipartUploadRequest new];
init.bucketName = uploadToBucket;
init.objectKey = uploadObjectkey;

// Tentukan apakah objek yang sudah ada dengan nama yang sama boleh ditimpa.
// Jika Anda tidak menentukan x-oss-forbid-overwrite, objek yang sudah ada dengan nama yang sama akan ditimpa secara default.
// Jika Anda mengatur x-oss-forbid-overwrite ke false, objek yang sudah ada dengan nama yang sama akan ditimpa.
// Jika Anda mengatur x-oss-forbid-overwrite ke true, objek yang sudah ada dengan nama yang sama tidak akan ditimpa. Jika objek dengan nama yang sama sudah ada, program akan melaporkan error.
init.objectMeta = @{@"x-oss-forbid-overwrite": @"true"};
// Tanggapan dari multipartUploadInit berisi upload ID. Upload ID ini secara unik mengidentifikasi tugas unggah multi-bagian. Anda dapat menggunakan upload ID ini untuk melakukan operasi seperti membatalkan atau mengkueri tugas unggah multi-bagian.
OSSTask * initTask = [client multipartUploadInit:init];
[initTask waitUntilFinished];
if (!initTask.error) {
    OSSInitMultipartUploadResult * result = initTask.result;
    uploadId = result.uploadId;
} else {
    NSLog(@"multipart upload failed, error: %@", initTask.error);
    return;
}

// Tentukan path lengkap file lokal yang akan diunggah.
NSString * filePath = @"/storage/emulated/0/oss/examplefile.txt";
// Dapatkan ukuran file yang akan diunggah.
uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil] fileSize];
// Atur nomor bagian. Nomor bagian dimulai dari 1. Setiap bagian yang diunggah memiliki nomor bagian yang berkisar antara 1 hingga 10.000.
int chuckCount = *;
// Atur ukuran bagian dalam byte. Ukuran bagian dapat berkisar antara 100 KB hingga 5 GB.
uint64_t offset = fileSize/chuckCount;
for (int i = 1; i <= chuckCount; i++) {
    OSSUploadPartRequest * uploadPart = [OSSUploadPartRequest new];
    uploadPart.bucketName = uploadToBucket;
    uploadPart.objectkey = uploadObjectkey;
    uploadPart.uploadId = uploadId;
    uploadPart.partNumber = i; // nomor bagian dimulai dari 1

    NSFileHandle* readHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
    [readHandle seekToFileOffset:offset * (i -1)];

    NSData* data = [readHandle readDataOfLength:offset];
    uploadPart.uploadPartData = data;

    OSSTask * uploadPartTask = [client uploadPart:uploadPart];

    [uploadPartTask waitUntilFinished];

    if (!uploadPartTask.error) {
        OSSUploadPartResult * result = uploadPartTask.result;
        uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:uploadPart.uploadPartFileURL.absoluteString error:nil] fileSize];
        [partInfos addObject:[OSSPartInfo partInfoWithPartNum:i eTag:result.eTag size:fileSize]];
    } else {
        NSLog(@"upload part error: %@", uploadPartTask.error);
        return;
    }
}

OSSCompleteMultipartUploadRequest * complete = [OSSCompleteMultipartUploadRequest new];
complete.bucketName = uploadToBucket;
complete.objectKey = uploadObjectkey;
complete.uploadId = uploadId;
complete.partInfos = partInfos;
// Tentukan apakah objek yang sudah ada dengan nama yang sama boleh ditimpa saat Anda menyelesaikan unggah multi-bagian.
// Jika Anda tidak menentukan x-oss-forbid-overwrite, objek yang sudah ada dengan nama yang sama akan ditimpa secara default.
// Jika Anda mengatur x-oss-forbid-overwrite ke false, objek yang sudah ada dengan nama yang sama akan ditimpa.
// Jika Anda mengatur x-oss-forbid-overwrite ke true, objek yang sudah ada dengan nama yang sama tidak akan ditimpa. Jika objek dengan nama yang sama sudah ada, program akan melaporkan error.
complete.completeMetaHeader = @{@"x-oss-forbid-overwrite": @"true"};

OSSTask * completeTask = [client completeMultipartUpload:complete];

[[completeTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"multipart upload success!");
    } else {
        NSLog(@"multipart upload error: %@", task.error);
    }
    return nil;
}] waitUntilFinished];

Referensi

  • Untuk informasi selengkapnya tentang Operasi API untuk unggah simple, lihat PutObject.

  • Untuk informasi selengkapnya tentang Operasi API untuk menyalin objek, lihat CopyObject.

  • Unggah multi-bagian yang lengkap terdiri dari tiga Operasi API. Untuk informasi selengkapnya, lihat topik berikut:

    • Untuk informasi selengkapnya tentang Operasi API untuk memulai event unggah multi-bagian, lihat InitiateMultipartUpload.

    • Untuk informasi selengkapnya tentang Operasi API untuk mengunggah bagian, lihat UploadPart.

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

  • Untuk informasi selengkapnya tentang cara menginisialisasi instans OSSClient, lihat Initialize an OSSClient instance.