All Products
Search
Document Center

Object Storage Service:Unggah multi-bagian (Java SDK V1)

Last Updated:Jun 11, 2026

Layanan Penyimpanan Objek (Object Storage Service/OSS) menyediakan fitur unggah multi-bagian untuk objek besar. Proses ini melibatkan pemisahan objek besar menjadi bagian-bagian yang lebih kecil, mengunggahnya secara independen, lalu memanggil API CompleteMultipartUpload untuk menggabungkan bagian-bagian tersebut menjadi satu objek utuh, sehingga memungkinkan unggah yang dapat dilanjutkan.

Catatan

  • Topik ini menggunakan titik akhir publik wilayah China (Hangzhou). Untuk mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama, gunakan titik akhir internal. Untuk detail wilayah dan titik akhir yang didukung, lihat Regions and Endpoints.

  • Pada topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi selengkapnya, lihat 配置访问凭证.

  • Topik ini menunjukkan cara membuat instans OSSClient dengan titik akhir OSS. Untuk konfigurasi alternatif, seperti menggunakan domain kustom atau melakukan autentikasi dengan kredensial dari Security Token Service (STS), lihat Client configuration.

  • Unggah multi-bagian menggunakan InitiateMultipartUpload, UploadPart, dan CompleteMultipartUpload. Anda harus memiliki izin oss:PutObject. Grant custom access policies to a RAM user.

Proses unggah multi-bagian

Unggah multi-bagian terdiri dari tiga langkah:

  1. Inisialisasi unggah multi-bagian.

    Panggil ossClient.initiateMultipartUpload. OSS akan mengembalikan upload ID yang unik secara global.

  2. Unggah bagian-bagian.

    Panggil ossClient.uploadPart untuk mengunggah data bagian.

    Catatan
    • Nomor bagian mengidentifikasi posisi suatu bagian dalam objek. Mengunggah data dengan nomor bagian yang sama akan menimpa bagian yang sudah ada.

    • OSS mengembalikan hash MD5 dari data bagian yang diterima dalam header respons ETag.

    • OSS menghitung hash MD5 dari data yang diunggah dan membandingkannya dengan hash yang dihitung oleh SDK. Ketidakcocokan akan mengembalikan kode kesalahan InvalidDigest.

  3. Selesaikan unggah multi-bagian.

    Setelah semua bagian diunggah, panggil ossClient.completeMultipartUpload untuk menggabungkan bagian-bagian tersebut menjadi satu objek utuh.

Kode contoh

Contoh berikut menunjukkan proses lengkap unggah multi-bagian:

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.Mimetypes;
import com.aliyun.oss.model.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Gunakan titik akhir wilayah China (Hangzhou) sebagai contoh. Tentukan titik akhir yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Peroleh 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, misalnya examplebucket.
        String bucketName = "examplebucket";
        // Tentukan path lengkap objek, misalnya exampledir/exampleobject.txt. Path lengkap tidak boleh mengandung nama bucket.
        String objectName = "exampledir/exampleobject.txt";
        // Path file lokal yang akan diunggah.
        String filePath = "D:\\localpath\\examplefile.txt";
        // 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 lagi digunakan, 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 {
            // Buat objek InitiateMultipartUploadRequest.
            InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);

            // Buat objek ObjectMetadata dan atur Content-Type.
            ObjectMetadata metadata = new ObjectMetadata();
            if (metadata.getContentType() == null) {
                metadata.setContentType(Mimetypes.getInstance().getMimetype(new File(filePath), objectName));
            }
            System.out.println("Content-Type: " + metadata.getContentType());

            // Ikat metadata ke permintaan unggah.
            request.setObjectMetadata(metadata);

            // Inisialisasi unggah multi-bagian.
            InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
            // Kembalikan upload ID.
            String uploadId = upresult.getUploadId();

            // partETags adalah kumpulan objek PartETag. Objek PartETag terdiri dari ETag dan nomor bagian suatu bagian.
            List<PartETag> partETags = new ArrayList<PartETag>();
            // Ukuran setiap bagian. Ini digunakan untuk menghitung jumlah bagian. Satuan: byte.
            // Ukuran bagian minimum adalah 100 KB, dan ukuran maksimum adalah 5 GB. Ukuran bagian terakhir dapat lebih kecil dari 100 KB.
            // Atur ukuran bagian menjadi 1 MB.
            final long partSize = 1 * 1024 * 1024L;   

            // Hitung jumlah bagian berdasarkan ukuran data yang akan diunggah. Kode berikut memberikan contoh cara memperoleh ukuran data yang akan diunggah dari file lokal menggunakan File.length().
            final File sampleFile = new File(filePath);
            long fileLength = sampleFile.length();
            int partCount = (int) (fileLength / partSize);
            if (fileLength % partSize != 0) {
                partCount++;
            }
            // Iterasi melalui bagian-bagian dan unggah.
            for (int i = 0; i < partCount; i++) {
                long startPos = i * partSize;
                long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
                UploadPartRequest uploadPartRequest = new UploadPartRequest();
                uploadPartRequest.setBucketName(bucketName);
                uploadPartRequest.setKey(objectName);
                uploadPartRequest.setUploadId(uploadId);
                // Atur aliran bagian yang akan diunggah.
                // Kode berikut memberikan contoh cara membuat objek FileInputStream dari file lokal dan melewati data tertentu menggunakan metode InputStream.skip().
                InputStream instream = new FileInputStream(sampleFile);
                instream.skip(startPos);
                uploadPartRequest.setInputStream(instream);
                // Atur ukuran bagian.
                uploadPartRequest.setPartSize(curPartSize);
                // Atur nomor bagian. Setiap bagian yang diunggah memiliki nomor bagian yang berkisar antara 1 hingga 10.000. Jika nomor bagian tidak dalam rentang tersebut, OSS akan mengembalikan kode kesalahan InvalidArgument.
                uploadPartRequest.setPartNumber(i + 1);
                // Bagian tidak perlu diunggah secara berurutan. Bahkan dapat diunggah dari client yang berbeda. OSS akan mengurutkan bagian berdasarkan nomor bagian untuk membuat objek utuh.
                UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
                // Setelah setiap bagian diunggah, respons OSS mencakup PartETag. PartETag disimpan dalam partETags.
                partETags.add(uploadPartResult.getPartETag());

                // Tutup aliran.
                instream.close();
            }

            // Buat objek CompleteMultipartUploadRequest.
            // Saat menyelesaikan unggah multi-bagian, Anda harus menyediakan semua partETags yang valid. Setelah OSS menerima partETags yang diajukan, OSS akan memverifikasi validitas setiap bagian. Setelah semua bagian diverifikasi, OSS akan menggabungkan bagian-bagian tersebut menjadi satu objek utuh.
            CompleteMultipartUploadRequest completeMultipartUploadRequest =
                    new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);

            // Selesaikan unggah multi-bagian.
            CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
            System.out.println("Unggah berhasil, ETag: " + completeMultipartUploadResult.getETag());

        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + 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 client mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Skenario umum

Atur metadata saat menginisialisasi unggah multi-bagian

Atur metadata selama inisialisasi unggah multi-bagian:

// Buat objek InitiateMultipartUploadRequest.
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);

ObjectMetadata metadata = new ObjectMetadata();
metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// Tentukan perilaku caching halaman web objek.
metadata.setCacheControl("no-cache");
// Tentukan nama objek saat diunduh.
metadata.setContentDisposition("attachment;filename=oss_MultipartUpload.txt");
// Tentukan format encoding konten objek.
metadata.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
// Tentukan apakah akan menimpa objek yang memiliki nama sama saat menginisialisasi unggah multi-bagian. Pada contoh ini, parameter ini diatur ke true, yang berarti objek dengan nama yang sama tidak akan ditimpa.
metadata.setHeader("x-oss-forbid-overwrite", "true");
// Tentukan metode enkripsi sisi server yang digunakan untuk mengunggah setiap bagian objek.
metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
// Tentukan algoritma enkripsi objek. Jika opsi ini tidak ditentukan, algoritma enkripsi AES256 akan digunakan.
metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_DATA_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
// Tentukan customer master key (CMK) yang dikelola oleh KMS.
metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION_KEY_ID, "9468da86-3509-4f8d-a61e-6eab1eac****");
// Tentukan kelas penyimpanan objek.
metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);
// Tentukan tag objek. Anda dapat menentukan beberapa tag sekaligus.
metadata.setHeader(OSSHeaders.OSS_TAGGING, "a:1");
request.setObjectMetadata(metadata);

// Secara otomatis atur Content-Type berdasarkan file. Jika parameter ini tidak diatur, Content-Type default adalah application/octet-stream.
if (metadata.getContentType() == null) {
    metadata.setContentType(Mimetypes.getInstance().getMimetype(new File(filePath), objectName));
}

// Ikat metadata ke permintaan unggah.
request.setObjectMetadata(metadata);
// Inisialisasi unggah multi-bagian.
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);

Atur izin akses objek saat menyelesaikan unggah multi-bagian

Atur izin akses objek saat menyelesaikan unggah multi-bagian:

completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.Private);

Otomatis proses part ETags saat menyelesaikan unggah multi-bagian

Otomatis proses part ETags saat menyelesaikan unggah multi-bagian:

// Tentukan apakah akan mencantumkan semua bagian yang telah diunggah untuk upload ID saat ini. Anda dapat mengatur partETags dalam CompleteMultipartUploadRequest ke null untuk menggabungkan bagian menjadi objek utuh dengan mencantumkan bagian di server saja jika Anda menggunakan Java SDK 3.14.0 atau yang lebih baru.
Map<String, String> headers = new HashMap<String, String>();
// Jika Anda menentukan x-oss-complete-all:yes, OSS akan mencantumkan semua bagian yang telah diunggah untuk upload ID saat ini, mengurutkan bagian berdasarkan nomor bagian, lalu menjalankan operasi CompleteMultipartUpload.
// Jika Anda menentukan x-oss-complete-all:yes, Anda tidak dapat menentukan body. Jika tidak, kesalahan akan dilaporkan.
headers.put("x-oss-complete-all","yes");
completeMultipartUploadRequest.setHeaders(headers);

Batalkan event unggah multi-bagian

Panggil abortMultipartUpload dengan upload ID dari InitiateMultipartUpload untuk membatalkan unggah multi-bagian. Setelah pembatalan, upload ID menjadi tidak valid dan semua bagian yang diunggah akan dihapus.

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Gunakan titik akhir wilayah China (Hangzhou) sebagai contoh. Tentukan titik akhir yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Peroleh 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, misalnya examplebucket.
        String bucketName = "examplebucket";
        // Tentukan path lengkap objek, misalnya exampledir/exampleobject.txt. Path lengkap tidak boleh mengandung nama bucket.
        String objectName = "exampledir/exampleobject.txt";
        // Tentukan upload ID, misalnya 0004B999EF518A1FE585B0C9360D****. Upload ID dikembalikan setelah operasi InitiateMultipartUpload dipanggil untuk menginisialisasi unggah multi-bagian.
        String uploadId = "0004B999EF518A1FE585B0C9360D****";
        // 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 lagi digunakan, 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 {
            // Batalkan unggah multi-bagian.
            AbortMultipartUploadRequest abortMultipartUploadRequest =
                    new AbortMultipartUploadRequest(bucketName, objectName, uploadId);
            ossClient.abortMultipartUpload(abortMultipartUploadRequest);
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + 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 client mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Cantumkan bagian yang diunggah

Panggil listParts dengan upload ID dari InitiateMultipartUpload untuk mencantumkan semua bagian yang diunggah.

Cantumkan bagian yang diunggah

Cantumkan bagian yang diunggah:

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Gunakan titik akhir wilayah China (Hangzhou) sebagai contoh. Tentukan titik akhir yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Peroleh 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, misalnya examplebucket.
        String bucketName = "examplebucket";
        // Tentukan path lengkap objek, misalnya exampledir/exampleobject.txt. Path lengkap tidak boleh mengandung nama bucket.
        String objectName = "exampledir/exampleobject.txt";
        // Tentukan upload ID, misalnya 0004B999EF518A1FE585B0C9360D****. Upload ID dikembalikan setelah operasi InitiateMultipartUpload dipanggil untuk menginisialisasi unggah multi-bagian dan sebelum operasi CompleteMultipartUpload dipanggil untuk menyelesaikan unggah multi-bagian.
        String uploadId = "0004B999EF518A1FE585B0C9360D****";
        // 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 lagi digunakan, 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 {
            // Cantumkan bagian yang diunggah.
            ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId);
            // Atur upload ID.
            //listPartsRequest.setUploadId(uploadId);
            // Atur jumlah bagian per halaman menjadi 100 untuk paging. Secara default, 1.000 bagian dicantumkan.
            listPartsRequest.setMaxParts(100);
            // Tentukan posisi awal untuk operasi pencantuman. Hanya bagian dengan nomor bagian lebih besar dari nilai parameter ini yang dicantumkan.
            listPartsRequest.setPartNumberMarker(2);
            PartListing partListing = ossClient.listParts(listPartsRequest);

            for (PartSummary part : partListing.getParts()) {
                // Peroleh nomor bagian.
                System.out.println(part.getPartNumber());
                // Peroleh ukuran data bagian.
                System.out.println(part.getSize());
                // Peroleh ETag bagian.
                System.out.println(part.getETag());
                // Peroleh waktu modifikasi terakhir bagian.
                System.out.println(part.getLastModified());
            }
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + 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 client mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Cantumkan semua bagian yang diunggah

Metode listParts mengembalikan maksimal 1.000 bagian per panggilan. Untuk mencantumkan semua bagian ketika jumlahnya melebihi 1.000:

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Gunakan titik akhir wilayah China (Hangzhou) sebagai contoh. Tentukan titik akhir yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Peroleh 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, misalnya examplebucket.
        String bucketName = "examplebucket";
        // Tentukan path lengkap objek, misalnya exampledir/exampleobject.txt. Path lengkap tidak boleh mengandung nama bucket.
        String objectName = "exampledir/exampleobject.txt";
        // Tentukan upload ID, misalnya 0004B999EF518A1FE585B0C9360D****. Upload ID dikembalikan setelah operasi InitiateMultipartUpload dipanggil untuk menginisialisasi unggah multi-bagian dan sebelum operasi CompleteMultipartUpload dipanggil untuk menyelesaikan unggah multi-bagian.
        String uploadId = "0004B999EF518A1FE585B0C9360D****";
        // 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 lagi digunakan, 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 {
            // Cantumkan semua bagian yang diunggah.
            PartListing partListing;
            ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId);

            do {
                partListing = ossClient.listParts(listPartsRequest);

                for (PartSummary part : partListing.getParts()) {
                    // Peroleh nomor bagian.
                    System.out.println(part.getPartNumber());
                    // Peroleh ukuran data bagian.
                    System.out.println(part.getSize());
                    // Peroleh ETag bagian.
                    System.out.println(part.getETag());
                    // Peroleh waktu modifikasi terakhir bagian.
                    System.out.println(part.getLastModified());
                }
                // Tentukan posisi awal untuk operasi pencantuman. Hanya bagian dengan nomor bagian lebih besar dari nilai parameter ini yang dicantumkan.
                listPartsRequest.setPartNumberMarker(partListing.getNextPartNumberMarker());
            } while (partListing.isTruncated());
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + 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 client mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Cantumkan semua bagian yang diunggah berdasarkan halaman

Cantumkan semua bagian dengan pagination:

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Gunakan titik akhir wilayah China (Hangzhou) sebagai contoh. Tentukan titik akhir yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Peroleh 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, misalnya examplebucket.
        String bucketName = "examplebucket";
        // Tentukan path lengkap objek, misalnya exampledir/exampleobject.txt. Path lengkap tidak boleh mengandung nama bucket.
        String objectName = "exampledir/exampleobject.txt";
        // Tentukan upload ID, misalnya 0004B999EF518A1FE585B0C9360D****. Upload ID dikembalikan setelah operasi InitiateMultipartUpload dipanggil untuk menginisialisasi unggah multi-bagian dan sebelum operasi CompleteMultipartUpload dipanggil untuk menyelesaikan unggah multi-bagian.
        String uploadId = "0004B999EF518A1FE585B0C9360D****";
        // 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 lagi digunakan, 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 {
            // Cantumkan bagian yang diunggah berdasarkan halaman.
            PartListing partListing;
            ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId);
            // Atur jumlah bagian yang dicantumkan per halaman menjadi 100 untuk pencantuman berhalaman.
            listPartsRequest.setMaxParts(100);

            do {
                partListing = ossClient.listParts(listPartsRequest);

                for (PartSummary part : partListing.getParts()) {
                    // Peroleh nomor bagian.
                    System.out.println(part.getPartNumber());
                    // Peroleh ukuran data bagian.
                    System.out.println(part.getSize());
                    // Peroleh ETag bagian.
                    System.out.println(part.getETag());
                    // Peroleh waktu modifikasi terakhir bagian.
                    System.out.println(part.getLastModified());
                }

                listPartsRequest.setPartNumberMarker(partListing.getNextPartNumberMarker());

            } while (partListing.isTruncated());
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + 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 client mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}                    

Cantumkan event unggah multi-bagian

Panggil listMultipartUploads untuk mencantumkan event unggah multi-bagian yang sedang berlangsung (telah diinisialisasi tetapi belum diselesaikan atau dibatalkan). Tabel berikut menjelaskan parameter yang dapat dikonfigurasi.

Parameter

Fungsi

Metode Konfigurasi

prefix

Hanya mengembalikan objek yang namanya diawali dengan prefix yang ditentukan. Nama objek yang dikembalikan tetap mengandung prefix tersebut.

ListMultipartUploadsRequest.setPrefix(String prefix)

delimiter

Mengelompokkan nama objek. Nama objek yang mengandung prefix yang ditentukan dan muncul di antara karakter delimiter dikelompokkan sebagai satu elemen.

ListMultipartUploadsRequest.setDelimiter(String delimiter)

maxUploads

Jumlah maksimum event unggah multi-bagian yang dikembalikan. Default dan maksimum: 1.000.

ListMultipartUploadsRequest.setMaxUploads(Integer maxUploads)

keyMarker

Mencantumkan event unggah multi-bagian untuk objek yang namanya secara leksikografis berada setelah keyMarker. Digunakan bersama uploadIdMarker untuk menetapkan posisi awal.

ListMultipartUploadsRequest.setKeyMarker(String keyMarker)

uploadIdMarker

Digunakan bersama keyMarker untuk menetapkan posisi awal. Tidak valid jika keyMarker tidak diatur. Saat keyMarker diatur, hasil mencakup:

  • Objek yang namanya secara leksikografis berada setelah keyMarker.

  • Event unggah multi-bagian untuk objek yang cocok dengan keyMarker dengan upload ID setelah uploadIdMarker.

ListMultipartUploadsRequest.setUploadIdMarker(String uploadIdMarker)

Cantumkan event unggah multi-bagian

Cantumkan event unggah multi-bagian:

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Gunakan titik akhir wilayah China (Hangzhou) sebagai contoh. Tentukan titik akhir yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Peroleh 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, misalnya examplebucket.
        String bucketName = "examplebucket";
        // 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 lagi digunakan, 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 {
            // Cantumkan event unggah multi-bagian. Secara default, 1.000 bagian dicantumkan.
            ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);
            MultipartUploadListing multipartUploadListing = ossClient.listMultipartUploads(listMultipartUploadsRequest);

            for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
                // Peroleh upload ID.
                System.out.println(multipartUpload.getUploadId());
                // Peroleh key.
                System.out.println(multipartUpload.getKey());
                // Peroleh waktu inisialisasi unggah multi-bagian.
                System.out.println(multipartUpload.getInitiated());
            }
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + 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 client mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Saat isTruncated bernilai true, nextKeyMarker dan nextUploadIdMarker menunjukkan titik awal untuk permintaan pencantuman berikutnya, memungkinkan pengambilan berhalaman.

Daftar semua event unggah multi-bagian

Metode listMultipartUploads mengembalikan maksimal 1.000 event per panggilan. Untuk mencantumkan semua event ketika jumlahnya melebihi 1.000:

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Gunakan titik akhir wilayah China (Hangzhou) sebagai contoh. Tentukan titik akhir yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Peroleh 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, misalnya examplebucket.
        String bucketName = "examplebucket";
        // 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 lagi digunakan, 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 {
            // Cantumkan event unggah multi-bagian.
            MultipartUploadListing multipartUploadListing;
            ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);

            do {
                multipartUploadListing = ossClient.listMultipartUploads(listMultipartUploadsRequest);

                for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
                    // Peroleh upload ID.
                    System.out.println(multipartUpload.getUploadId());
                    // Peroleh key.
                    System.out.println(multipartUpload.getKey());
                    // Peroleh waktu inisialisasi unggah multi-bagian.
                    System.out.println(multipartUpload.getInitiated());
                }

                listMultipartUploadsRequest.setKeyMarker(multipartUploadListing.getNextKeyMarker());

                listMultipartUploadsRequest.setUploadIdMarker(multipartUploadListing.getNextUploadIdMarker());
            } while (multipartUploadListing.isTruncated());
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + 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 client mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Cantumkan semua event unggah berdasarkan halaman

Cantumkan semua event unggah dengan pagination:

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Gunakan titik akhir wilayah China (Hangzhou) sebagai contoh. Tentukan titik akhir yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Peroleh 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, misalnya examplebucket.
        String bucketName = "examplebucket";
        // 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 lagi digunakan, 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 {
            // Cantumkan event unggah multi-bagian.
            MultipartUploadListing multipartUploadListing;
            ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);
            // Atur jumlah event unggah multi-bagian yang dicantumkan per halaman.
            listMultipartUploadsRequest.setMaxUploads(50);

            do {
                multipartUploadListing = ossClient.listMultipartUploads(listMultipartUploadsRequest);

                for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
                    // Peroleh upload ID.
                    System.out.println(multipartUpload.getUploadId());
                    // Peroleh key.
                    System.out.println(multipartUpload.getKey());
                    // Peroleh waktu inisialisasi unggah multi-bagian.
                    System.out.println(multipartUpload.getInitiated());
                }

                listMultipartUploadsRequest.setKeyMarker(multipartUploadListing.getNextKeyMarker());
                listMultipartUploadsRequest.setUploadIdMarker(multipartUploadListing.getNextUploadIdMarker());

            } while (multipartUploadListing.isTruncated());
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + 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 client mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Lakukan unggah multi-bagian untuk aliran jaringan atau aliran data

Contoh pada topik ini menggunakan file lokal. Untuk mengunggah aliran jaringan atau aliran data, gunakan Multipart upload of a data stream.

Referensi