全部产品
Search
文档中心

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

更新时间:Dec 06, 2025

Layanan Penyimpanan Objek (OSS) menyediakan fitur unggah multi-bagian yang memungkinkan Anda membagi objek besar menjadi beberapa bagian dan mengunggahnya secara independen. Setelah semua bagian diunggah, Anda dapat memanggil operasi CompleteMultipartUpload untuk menggabungkan bagian-bagian tersebut menjadi satu objek utuh. Proses ini mendukung unggah yang dapat dilanjutkan.

Catatan

  • Pada topik ini, digunakan 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 Wilayah dan titik akhir.

  • Pada topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi lebih lanjut tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi kredensial akses.

  • Pada topik ini, instans OSSClient dibuat 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.

  • Untuk menyelesaikan proses unggah multi-bagian—yang mencakup operasi InitiateMultipartUpload, UploadPart, dan CompleteMultipartUpload—Anda harus memiliki izin oss:PutObject. Untuk informasi lebih lanjut, lihat Berikan kebijakan akses kustom kepada RAM user.

Proses unggah multi-bagian

Unggah multi-bagian terdiri dari tiga langkah berikut:

  1. Inisialisasi event unggah multi-bagian.

    Panggil metode ossClient.initiateMultipartUpload. OSS mengembalikan upload ID yang unik secara global dalam respons.

  2. Unggah bagian-bagian.

    Panggil metode ossClient.uploadPart untuk mengunggah data bagian.

    Catatan
    • Untuk upload ID yang sama, nomor bagian menentukan posisi bagian tersebut dalam keseluruhan file. Jika Anda mengunggah data baru dengan nomor bagian yang sama, data bagian yang ada di OSS akan ditimpa.

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

    • OSS menghitung hash MD5 dari data yang diunggah dan membandingkannya dengan hash MD5 yang dihitung oleh SDK. Jika kedua hash MD5 tidak cocok, kode kesalahan InvalidDigest dikembalikan.

  3. Selesaikan unggah multi-bagian.

    Setelah semua bagian diunggah, panggil metode ossClient.completeMultipartUpload untuk menggabungkan bagian-bagian tersebut menjadi satu file 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 {
        // Titik akhir wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan Titik akhir yang sebenarnya.
        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, 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.
        // Saat 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());

            // Kaitkan 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 bagian 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 mendapatkan 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 semuanya.
            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 berada di luar rentang tersebut, OSS mengembalikan kode kesalahan InvalidArgument.
                uploadPartRequest.setPartNumber(i + 1);
                // Bagian tidak perlu diunggah secara berurutan. Bahkan, bagian dapat diunggah dari client yang berbeda. OSS mengurutkan bagian berdasarkan nomor bagian untuk membuat file 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 dikirimkan, OSS memverifikasi validitas setiap bagian. Setelah semua bagian diverifikasi, OSS menggabungkan bagian-bagian tersebut menjadi satu file 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

Potongan kode berikut menunjukkan cara mengatur metadata saat menginisialisasi 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 untuk 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 objek dengan nama yang sama akan ditimpa 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));
}

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

Atur izin akses file saat menyelesaikan unggah multi-bagian

Potongan kode berikut menunjukkan cara mengatur izin akses file saat menyelesaikan unggah multi-bagian.

completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.Private);

Otomatis proses part ETags saat menyelesaikan unggah multi-bagian

Potongan kode berikut menunjukkan cara secara otomatis memproses 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 file utuh dengan mencantumkan bagian di server saja, asalkan 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

Untuk membatalkan event unggah multi-bagian, ambil upload ID yang dikembalikan setelah Anda memanggil InitiateMultipartUpload. Kemudian, gunakan upload ID tersebut untuk memanggil metode abortMultipartUpload guna membatalkan event unggah multi-bagian. Setelah event unggah multi-bagian dibatalkan, Anda tidak dapat menggunakan upload ID tersebut untuk operasi apa pun. Bagian-bagian yang sudah diunggah akan dihapus. Potongan kode berikut menunjukkan cara membatalkan 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 {
        // Titik akhir wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan Titik akhir yang sebenarnya.
        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, 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.
        // Saat 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 telah diunggah

Untuk mencantumkan bagian yang telah diunggah, ambil upload ID yang dikembalikan setelah Anda memanggil InitiateMultipartUpload dan sebelum memanggil CompleteMultipartUpload. Kemudian, gunakan upload ID tersebut untuk memanggil metode listParts guna mencantumkan semua bagian yang berhasil diunggah untuk upload ID tertentu.

Cantumkan bagian yang telah diunggah

Potongan kode berikut menunjukkan cara mencantumkan bagian yang telah 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 {
        // Titik akhir wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan Titik akhir yang sebenarnya.
        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, 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.
        // Saat 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 telah 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()) {
                // Dapatkan nomor bagian.
                System.out.println(part.getPartNumber());
                // Dapatkan ukuran data bagian.
                System.out.println(part.getSize());
                // Dapatkan ETag bagian.
                System.out.println(part.getETag());
                // Dapatkan 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 telah diunggah

Secara default, Anda dapat mencantumkan maksimal 1.000 bagian sekaligus dengan memanggil metode listParts. Jika jumlah bagian melebihi 1.000, gunakan potongan kode berikut untuk mencantumkan semua bagian yang telah 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 {
        // Titik akhir wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan Titik akhir yang sebenarnya.
        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, 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.
        // Saat 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 telah diunggah.
            PartListing partListing;
            ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId);

            do {
                partListing = ossClient.listParts(listPartsRequest);

                for (PartSummary part : partListing.getParts()) {
                    // Dapatkan nomor bagian.
                    System.out.println(part.getPartNumber());
                    // Dapatkan ukuran data bagian.
                    System.out.println(part.getSize());
                    // Dapatkan ETag bagian.
                    System.out.println(part.getETag());
                    // Dapatkan 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 telah diunggah per halaman

Potongan kode berikut menunjukkan cara menentukan jumlah bagian per halaman dan mencantumkan semua bagian secara bertahap.

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 {
        // Titik akhir wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan Titik akhir yang sebenarnya.
        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, 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.
        // Saat 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 telah diunggah per halaman.
            PartListing partListing;
            ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId);
            // Atur jumlah bagian yang dicantumkan per halaman menjadi 100 untuk pencantuman bertahap.
            listPartsRequest.setMaxParts(100);

            do {
                partListing = ossClient.listParts(listPartsRequest);

                for (PartSummary part : partListing.getParts()) {
                    // Dapatkan nomor bagian.
                    System.out.println(part.getPartNumber());
                    // Dapatkan ukuran data bagian.
                    System.out.println(part.getSize());
                    // Dapatkan ETag bagian.
                    System.out.println(part.getETag());
                    // Dapatkan 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

Anda dapat memanggil metode listMultipartUploads untuk mencantumkan semua event unggah multi-bagian yang sedang berlangsung. Event unggah multi-bagian yang sedang berlangsung adalah event yang telah diinisialisasi tetapi belum diselesaikan atau dibatalkan. Parameter yang dapat dikonfigurasi dijelaskan dalam tabel berikut.

Parameter

Fungsi

Metode

prefix

Menentukan bahwa nama file yang dikembalikan harus memiliki awalan tertentu. Perhatikan bahwa saat melakukan kueri berdasarkan awalan, nama file yang dikembalikan tetap mengandung awalan tersebut.

ListMultipartUploadsRequest.setPrefix(String prefix)

delimiter

Karakter yang digunakan untuk mengelompokkan nama file. Semua nama file yang mengandung awalan tertentu dan muncul pertama kali di antara karakter delimiter dianggap sebagai satu kelompok elemen.

ListMultipartUploadsRequest.setDelimiter(String delimiter)

maxUploads

Jumlah maksimum event unggah multi-bagian yang dikembalikan. Nilai default dan maksimum adalah 1.000.

ListMultipartUploadsRequest.setMaxUploads(Integer maxUploads)

keyMarker

Event unggah multi-bagian untuk file yang namanya secara leksikografis lebih besar dari nilai parameter keyMarker. Parameter ini digunakan bersama parameter uploadIdMarker untuk menentukan posisi awal hasil yang dikembalikan.

ListMultipartUploadsRequest.setKeyMarker(String keyMarker)

uploadIdMarker

Digunakan bersama parameter keyMarker untuk menentukan posisi awal hasil yang dikembalikan. Jika parameter keyMarker tidak diatur, parameter ini tidak berlaku. Jika parameter keyMarker diatur, hasil kueri mencakup hal berikut:

  • Semua file yang namanya secara leksikografis lebih besar dari nilai parameter keyMarker.

  • Semua event unggah multi-bagian untuk file yang namanya sama dengan nilai parameter keyMarker dan upload ID-nya lebih besar dari nilai parameter uploadIdMarker.

ListMultipartUploadsRequest.setUploadIdMarker(String uploadIdMarker)

Cantumkan event unggah multi-bagian

Potongan kode berikut menunjukkan cara mencantumkan 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 {
        // Titik akhir wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan Titik akhir yang sebenarnya.
        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, 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.
        // Saat 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()) {
                // Dapatkan upload ID.
                System.out.println(multipartUpload.getUploadId());
                // Dapatkan key.
                System.out.println(multipartUpload.getKey());
                // Dapatkan 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();
            }
        }
    }
}

Jika nilai isTruncated dalam respons adalah true, nextKeyMarker dan nextUploadIdMarker dikembalikan untuk menunjukkan titik awal operasi pencantuman berikutnya. Jika Anda tidak dapat mengambil semua event unggah sekaligus, Anda dapat mencantumkannya secara bertahap.

Cantumkan semua event unggah multi-bagian

Secara default, Anda dapat mencantumkan maksimal 1.000 event unggah multi-bagian sekaligus dengan memanggil metode listMultipartUploads. Jika jumlah event melebihi 1.000, gunakan potongan kode berikut untuk mencantumkan semua 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 {
        // Titik akhir wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan Titik akhir yang sebenarnya.
        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, 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.
        // Saat 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()) {
                    // Dapatkan upload ID.
                    System.out.println(multipartUpload.getUploadId());
                    // Dapatkan nama file.
                    System.out.println(multipartUpload.getKey());
                    // Dapatkan 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 per halaman

Potongan kode berikut menunjukkan cara mencantumkan semua event unggah secara bertahap.

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 {
        // Titik akhir wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan Titik akhir yang sebenarnya.
        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, 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.
        // Saat 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()) {
                    // Dapatkan upload ID.
                    System.out.println(multipartUpload.getUploadId());
                    // Dapatkan key.
                    System.out.println(multipartUpload.getKey());
                    // Dapatkan 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

Topik ini memberikan contoh cara melakukan unggah multi-bagian untuk file lokal. Untuk informasi lebih lanjut tentang cara melakukan unggah multi-bagian untuk aliran jaringan atau aliran data, lihat Unggah multi-bagian aliran data.

Referensi

  • Untuk kode contoh lengkap unggah multi-bagian, lihat Contoh GitHub.

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

  • Untuk informasi lebih lanjut tentang operasi API yang digunakan untuk membatalkan event unggah multi-bagian, lihat AbortMultipartUpload.

  • Untuk informasi lebih lanjut tentang operasi API yang digunakan untuk mencantumkan bagian yang telah diunggah, lihat ListParts.

  • Untuk informasi lebih lanjut tentang operasi API yang digunakan untuk mencantumkan semua event unggah multi-bagian yang sedang berlangsung, lihat ListMultipartUploads.