全部产品
Search
文档中心

Object Storage Service:Unggah multi-bagian (iOS SDK)

更新时间:Nov 30, 2025

Object Storage Service (OSS) menyediakan fitur unggah multi-bagian yang memungkinkan Anda memisahkan objek besar menjadi beberapa bagian dan mengunggahnya secara terpisah. Setelah pengunggahan selesai, Anda dapat memanggil operasi CompleteMultipartUpload untuk menggabungkan bagian-bagian tersebut menjadi satu objek utuh.

Catatan penggunaan

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

    Catatan

    Saat menginisialisasi instans OSSClient, tentukan titik akhir yang dipetakan ke wilayah bucket tersebut.

  • Untuk mengunggah file, Anda harus memiliki izin oss:PutObject. Untuk informasi selengkapnya, lihat Lampirkan kebijakan kustom ke RAM user.

Proses unggah multi-bagian

Untuk melakukan unggah multi-bagian, lakukan langkah-langkah berikut:

  1. Pisahkan objek yang ingin Anda unggah menjadi beberapa bagian.

  2. Panggil operasi InitiateMultipartUpload untuk memulai task unggah multi-bagian.

  3. Panggil operasi UploadPart untuk mengunggah bagian-bagian tersebut satu per satu atau secara paralel.

  4. Panggil operasi CompleteMultipartUpload untuk menyelesaikan task pengunggahan.

Perhatikan hal-hal berikut mengenai prosedur ini:

  • Setiap bagian, kecuali bagian terakhir, harus berukuran minimal 100 KB. Jika tidak, operasi CompleteMultipartUpload akan gagal.

  • Posisi suatu bagian dalam objek ditentukan oleh nomor bagian yang Anda tentukan selama proses pengunggahan. Bagian-bagian tersebut tidak perlu diunggah secara berurutan dan dapat diunggah secara konkuren.

    Untuk mengunggah bagian secara konkuren, tentukan tingkat konkurensi yang sesuai berdasarkan kondisi jaringan dan beban perangkat Anda. Tingkat konkurensi yang lebih tinggi belum tentu menghasilkan kecepatan unggah yang lebih cepat. Kami menyarankan Anda memperbesar ukuran bagian saat kondisi jaringan stabil dan memperkecil ukuran bagian saat kondisi jaringan tidak stabil.

  • Secara default, jika Anda mengunggah bagian-bagian suatu objek tetapi tidak memanggil operasi CompleteMultipartUpload untuk menggabungkannya, bagian-bagian yang telah diunggah tidak akan dihapus secara otomatis. Anda dapat memanggil operasi AbortMultipartUpload untuk menghentikan task pengunggahan dan menghapus bagian-bagian tersebut. Untuk informasi selengkapnya tentang cara menghapus bagian yang diunggah secara otomatis, lihat Aturan siklus hidup berdasarkan waktu modifikasi terakhir.

Kode contoh lengkap untuk task unggah multi-bagian

Kode contoh berikut memberikan contoh lengkap implementasi task unggah multi-bagian:

__block NSString * uploadId = nil;
__block NSMutableArray * partInfos = [NSMutableArray new];
// Tentukan nama bucket. Contoh: examplebucket. 
NSString * uploadToBucket = @"examplebucket";
// Tentukan path lengkap objek. Contoh: exampledir/exampleobject.txt. Jangan sertakan nama bucket dalam path lengkap. 
NSString * uploadObjectkey = @"exampledir/exampleobject.txt";
// Gunakan OSSInitMultipartUploadRequest untuk menentukan nama objek yang diunggah dan nama bucket tempat objek disimpan. 
OSSInitMultipartUploadRequest * init = [OSSInitMultipartUploadRequest new];
init.bucketName = uploadToBucket;
init.objectKey = uploadObjectkey;
// init.contentType = @"application/octet-stream";
// Respons dari multipartUploadInit berisi upload ID. Upload ID adalah ID unik dari task unggah multi-bagian. 
OSSTask * initTask = [client multipartUploadInit:init];
[initTask waitUntilFinished];
if (!initTask.error) {
    OSSInitMultipartUploadResult * result = initTask.result;
    uploadId = result.uploadId;
    // Batalkan task unggah multi-bagian atau daftar bagian yang telah diunggah berdasarkan upload ID. 
    // Jika ingin membatalkan task unggah multi-bagian berdasarkan upload ID, peroleh upload ID setelah memanggil operasi InitiateMultipartUpload untuk memulai task tersebut. 
    // Jika ingin mendaftar bagian yang telah diunggah dalam task unggah multi-bagian berdasarkan upload ID, peroleh upload ID setelah memanggil operasi InitiateMultipartUpload untuk memulai task tersebut tetapi sebelum memanggil operasi CompleteMultipartUpload untuk menyelesaikannya. 
    //NSLog(@"UploadId": %@, uploadId);
} else {
    NSLog(@"unggah multi-bagian gagal, error: %@", initTask.error);
    return;
}

// Tentukan objek yang ingin diunggah. 
NSString * filePath = @"<filepath>";
// Periksa ukuran objek. 
uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil] fileSize];
// Tentukan jumlah bagian. 
int chuckCount = 10;
// Tentukan ukuran bagian. 
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(@"error unggah bagian: %@", uploadPartTask.error);
        return;
    }
}
OSSCompleteMultipartUploadRequest * complete = [OSSCompleteMultipartUploadRequest new];
complete.bucketName = uploadToBucket;
complete.objectKey = uploadObjectkey;
complete.uploadId = uploadId;
complete.partInfos = partInfos;

OSSTask * completeTask = [client completeMultipartUpload:complete];

[[completeTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        OSSCompleteMultipartUploadResult * result = task.result;
        // ...
    } else {
        // ...
    }
    return nil;
}] waitUntilFinished];

Unggah file lokal menggunakan unggah multi-bagian

Catatan

Kode contoh lengkap sebelumnya mengimplementasikan task unggah multi-bagian sesuai proses unggah multi-bagian. Kode contoh berikut mengenkapsulasi kode tersebut sehingga Anda dapat mengunggah file lokal dalam bentuk bagian hanya dengan menggunakan MultipartUploadRequest.

Kode contoh berikut menunjukkan cara mengunggah file lokal menggunakan unggah multi-bagian:

// Tentukan nama bucket. Contoh: examplebucket. 
NSString *bucketName = @"examplebucket";
// Tentukan path lengkap objek. Contoh: exampledir/exampleobject.txt. Jangan sertakan nama bucket dalam path lengkap. 
NSString *objectKey = @"exampledir/exampleobject.txt";

OSSMultipartUploadRequest * multipartUploadRequest = [OSSMultipartUploadRequest new];
multipartUploadRequest.bucketName = bucketName;
multipartUploadRequest.objectKey = objectKey;
// Tentukan ukuran bagian. Ukuran bagian default adalah 256 KB. 
multipartUploadRequest.partSize = 1024 * 1024;
multipartUploadRequest.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
    NSLog(@"progress: %lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};

multipartUploadRequest.uploadingFileURL = [[NSBundle mainBundle] URLForResource:@"wangwang" withExtension:@"zip"];
OSSTask * multipartTask = [client multipartUpload:multipartUploadRequest];
[[multipartTask continueWithBlock:^id(OSSTask *task) {
    if (task.error) {
        NSLog(@"error: %@", task.error);
    } else {
        NSLog(@"Unggah file berhasil");
    }
    return nil;
}] waitUntilFinished];

Daftar bagian yang telah diunggah

Panggil metode listParts untuk mendaftar semua bagian yang telah diunggah dalam suatu event pengunggahan.

OSSListPartsRequest * listParts = [OSSListPartsRequest new];
// Tentukan nama bucket. Contoh: examplebucket. 
listParts.bucketName = @"examplebucket";
// Tentukan path lengkap objek. Contoh: exampledir/exampleobject.txt. Jangan sertakan nama bucket dalam path lengkap. 
listParts.objectKey = @"exampledir/exampleobject.txt";
// Tentukan upload ID. Anda dapat memperoleh upload ID dari respons operasi InitiateMultipartUpload. Anda harus memperoleh upload ID sebelum memanggil operasi CompleteMultipartUpload untuk menyelesaikan task unggah multi-bagian. 
listParts.uploadId = @"0004B999EF518A1FE585B0C9****";

OSSTask * listPartTask = [client listParts:listParts];

[listPartTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"daftar hasil bagian berhasil!");
        OSSListPartsResult * listPartResult = task.result;
        for (NSDictionary * partInfo in listPartResult.parts) {
            NSLog(@"setiap bagian: %@", partInfo);
        }
    } else {
        NSLog(@"error daftar hasil bagian: %@", task.error);
    }
    return nil;
}];
// waitUntilFinished memblokir eksekusi thread saat ini tetapi tidak memblokir progres task. 
// [listPartTask waitUntilFinished];            
Penting

Secara default, jika suatu bucket berisi lebih dari 1.000 bagian yang diunggah menggunakan unggah multi-bagian, OSS akan mengembalikan 1.000 bagian pertama. Dalam respons, nilai bidang IsTruncated adalah false dan NextPartNumberMarker dikembalikan untuk menunjukkan posisi awal operasi daftar berikutnya.

Batalkan task unggah multi-bagian

Kode berikut membatalkan permintaan unggah multi-bagian untuk UploadId tertentu.

OSSAbortMultipartUploadRequest * abort = [OSSAbortMultipartUploadRequest new];
// Tentukan nama bucket. Contoh: examplebucket. 
abort.bucketName = @"examplebucket";
// Tentukan path lengkap objek. Contoh: exampledir/exampleobject.txt. Jangan sertakan nama bucket dalam path lengkap. 
abort.objectKey = @"exampledir/exampleobject.txt";
// Tentukan upload ID. Anda dapat memperoleh upload ID dari respons operasi InitiateMultipartUpload. 
abort.uploadId = @"0004B999EF518A1FE585B0C9****";

OSSTask * abortTask = [client abortMultipartUpload:abort];

[abortTask waitUntilFinished];

if (!abortTask.error) {
    OSSAbortMultipartUploadResult * result = abortTask.result;
    uploadId = result.uploadId;
} else {
    NSLog(@"unggah multi-bagian gagal, error: %@", abortTask.error);
    return;
}
// waitUntilFinished memblokir eksekusi thread saat ini tetapi tidak memblokir progres task. 
// [abortTask waitUntilFinished];            

Referensi

  • Untuk kode contoh lengkap yang digunakan untuk melakukan unggah multi-bagian, kunjungi GitHub.

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

  • Untuk informasi selengkapnya tentang operasi API yang dapat Anda panggil untuk mendaftar bagian yang telah diunggah, lihat ListParts.

  • Untuk informasi selengkapnya tentang operasi API yang dapat Anda panggil untuk membatalkan task unggah multi-bagian, lihat AbortMultipartUpload.