すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:マルチパートアップロード (Java SDK V1)

最終更新日:Dec 06, 2025

Object Storage Service (OSS) は、マルチパートアップロード機能を提供します。この機能を使用すると、大きなオブジェクトを複数のパートに分割し、それぞれを個別にアップロードできます。すべてのパートがアップロードされた後、`CompleteMultipartUpload` 操作を呼び出して、パートを完全なオブジェクトに結合できます。このプロセスにより、再開可能なアップロードが可能になります。

注意事項

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。

  • このトピックでは、OSS エンドポイントを使用して `OSSClient` インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して `OSSClient` インスタンスを作成する場合は、「一般的なシナリオの設定例」をご参照ください。

  • `InitiateMultipartUpload`、`UploadPart`、`CompleteMultipartUpload` 操作を含むマルチパートアップロードプロセスを完了するには、oss:PutObject 権限が必要です。詳細については、「RAM ユーザーへのカスタムアクセスポリシーの付与」をご参照ください。

マルチパートアップロードのプロセス

マルチパートアップロードは、次の 3 つのステップで構成されます。

  1. マルチパートアップロードイベントの初期化

    `ossClient.initiateMultipartUpload` メソッドを呼び出します。OSS は、レスポンスでグローバルに一意のアップロード ID を返します。

  2. パートのアップロード

    `ossClient.uploadPart` メソッドを呼び出して、パートデータをアップロードします。

    説明
    • 同じアップロード ID の場合、パート番号はファイル全体におけるパートの位置を識別します。同じパート番号で新しいデータをアップロードすると、OSS 内の既存のパートデータは上書きされます。

    • OSS は、レスポンスの ETag ヘッダーで、受信したパートデータの MD5 ハッシュを返します。

    • OSS は、アップロードされたデータの MD5 ハッシュを計算し、SDK によって計算された MD5 ハッシュと比較します。2 つの MD5 ハッシュが一致しない場合、`InvalidDigest` エラーコードが返されます。

  3. マルチパートアップロードの完了

    すべてのパートがアップロードされた後、`ossClient.completeMultipartUpload` メソッドを呼び出して、パートを完全なファイルにマージします。

コード例

次の例は、完全なマルチパートアップロードのプロセスを示しています。

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 {
        // 例として、中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します (例: examplebucket)。
        String bucketName = "examplebucket";
        // オブジェクトのフルパスを指定します (例: exampledir/exampleobject.txt)。フルパスにバケット名を含めることはできません。
        String objectName = "exampledir/exampleobject.txt";
        // アップロードするローカルファイルのパス。
        String filePath = "D:\\localpath\\examplefile.txt";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // InitiateMultipartUploadRequest オブジェクトを作成します。
            InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);

            // ObjectMetadata オブジェクトを作成し、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());

            // メタデータをアップロードリクエストにバインドします。
            request.setObjectMetadata(metadata);

            // マルチパートアップロードを初期化します。
            InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
            // アップロード ID を返します。
            String uploadId = upresult.getUploadId();

            // partETags は PartETag オブジェクトのコレクションです。PartETag オブジェクトは、パートの ETag とパート番号で構成されます。
            List<PartETag> partETags = new ArrayList<PartETag>();
            // 各パートのサイズ。これはパート数を計算するために使用されます。単位:バイト。
            // 最小パートサイズは 100 KB、最大パートサイズは 5 GB です。最後のパートのサイズは 100 KB より小さくてもかまいません。
            // パートサイズを 1 MB に設定します。
            final long partSize = 1 * 1024 * 1024L;   

            // アップロードするデータのサイズに基づいてパート数を計算します。次のコードは、File.length() を使用してローカルファイルからアップロードするデータのサイズを取得する方法の例です。
            final File sampleFile = new File(filePath);
            long fileLength = sampleFile.length();
            int partCount = (int) (fileLength / partSize);
            if (fileLength % partSize != 0) {
                partCount++;
            }
            // パートを走査してアップロードします。
            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);
                // アップロードするパートのストリームを設定します。
                // 次のコードは、ローカルファイルから FileInputStream オブジェクトを作成し、InputStream.skip() メソッドを使用して指定されたデータをスキップする方法の例です。
                InputStream instream = new FileInputStream(sampleFile);
                instream.skip(startPos);
                uploadPartRequest.setInputStream(instream);
                // パートサイズを設定します。
                uploadPartRequest.setPartSize(curPartSize);
                // パート番号を設定します。アップロードされた各パートには、1 から 10,000 の範囲のパート番号があります。パート番号がこの範囲にない場合、OSS は InvalidArgument エラーコードを返します。
                uploadPartRequest.setPartNumber(i + 1);
                // パートは順番にアップロードする必要はありません。異なるクライアントからアップロードすることも可能です。OSS はパート番号でパートをソートして、完全なファイルを作成します。
                UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
                // 各パートがアップロードされると、OSS レスポンスには PartETag が含まれます。PartETag は partETags に保存されます。
                partETags.add(uploadPartResult.getPartETag());

                // ストリームを閉じます。
                instream.close();
            }

            // CompleteMultipartUploadRequest オブジェクトを作成します。
            // マルチパートアップロードを完了するときは、すべての有効な partETags を提供する必要があります。OSS は、送信された partETags を受信した後、各パートの有効性を検証します。すべてのパートが検証された後、OSS はこれらのパートを完全なファイルに結合します。
            CompleteMultipartUploadRequest completeMultipartUploadRequest =
                    new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);

            // マルチパートアップロードを完了します。
            CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
            System.out.println("Upload successful, ETag: " + completeMultipartUploadResult.getETag());

        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught a ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

一般的なシナリオ

マルチパートアップロードの初期化時のメタデータ設定

次のコードスニペットは、マルチパートアップロードを初期化するときにメタデータを設定する方法を示しています。

// InitiateMultipartUploadRequest オブジェクトを作成します。
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);

ObjectMetadata metadata = new ObjectMetadata();
metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// オブジェクトの Web ページキャッシュ動作を指定します。
metadata.setCacheControl("no-cache");
// ダウンロード時のオブジェクト名を指定します。
metadata.setContentDisposition("attachment;filename=oss_MultipartUpload.txt");
// オブジェクトのコンテンツエンコード形式を指定します。
metadata.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
// マルチパートアップロードを初期化するときに、同じ名前のオブジェクトを上書きするかどうかを指定します。この例では、このパラメーターは true に設定されており、同じ名前のオブジェクトは上書きされないことを示します。
metadata.setHeader("x-oss-forbid-overwrite", "true");
// オブジェクトの各パートをアップロードするために使用されるサーバー側暗号化方式を指定します。
metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
// オブジェクトの暗号化アルゴリズムを指定します。このオプションが指定されていない場合、AES256 暗号化アルゴリズムが使用されます。
metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_DATA_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
// KMS によって管理されるカスタマーマスターキー (CMK) を指定します。
metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION_KEY_ID, "9468da86-3509-4f8d-a61e-6eab1eac****");
// オブジェクトのストレージクラスを指定します。
metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);
// オブジェクトのタグを指定します。複数のタグを同時に指定できます。
metadata.setHeader(OSSHeaders.OSS_TAGGING, "a:1");
request.setObjectMetadata(metadata);

// ファイルに基づいて Content-Type を自動的に設定します。このパラメーターが設定されていない場合、デフォルトの Content-Type は application/octet-stream です。
if (metadata.getContentType() == null) {
    metadata.setContentType(Mimetypes.getInstance().getMimetype(new File(filePath), objectName));
}

// メタデータをアップロードリクエストにバインドします。
request.setObjectMetadata(metadata);
// マルチパートアップロードを初期化します。
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);

マルチパートアップロード完了時のファイルアクセス権限の設定

次のコードスニペットは、マルチパートアップロードを完了するときにファイルのアクセス権限を設定する方法を示しています。

completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.Private);

マルチパートアップロード完了時の part ETag の自動処理

次のコードスニペットは、マルチパートアップロードを完了するときに part ETag を自動的に処理する方法を示しています。

// 現在のアップロード ID に対してアップロードされたすべてのパートをリスト表示するかどうかを指定します。Java SDK 3.14.0 以降を使用している場合、CompleteMultipartUploadRequest の partETags を null に設定して、サーバー上のパートをリスト表示するだけでパートを完全なファイルにマージできます。
Map<String, String> headers = new HashMap<String, String>();
// x-oss-complete-all:yes を指定すると、OSS は現在のアップロード ID に対してアップロードされたすべてのパートをリスト表示し、パート番号でソートしてから CompleteMultipartUpload 操作を実行します。
// x-oss-complete-all:yes を指定した場合、本文を指定することはできません。指定するとエラーが報告されます。
headers.put("x-oss-complete-all","yes");
completeMultipartUploadRequest.setHeaders(headers);

マルチパートアップロードイベントのキャンセル

`InitiateMultipartUpload` を呼び出した後に返されるアップロード ID を取得することで、マルチパートアップロードイベントをキャンセルできます。次に、そのアップロード ID を使用して `abortMultipartUpload` メソッドを呼び出し、マルチパートアップロードイベントをキャンセルします。マルチパートアップロードイベントがキャンセルされると、そのアップロード ID をどの操作にも使用できなくなります。すでにアップロードされたパートは削除されます。次のコードスニペットは、マルチパートアップロードイベントをキャンセルする方法を示しています。

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 {
        // 例として、中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します (例: examplebucket)。
        String bucketName = "examplebucket";
        // オブジェクトのフルパスを指定します (例: exampledir/exampleobject.txt)。フルパスにバケット名を含めることはできません。
        String objectName = "exampledir/exampleobject.txt";
        // アップロード ID を指定します (例: 0004B999EF518A1FE585B0C9360D****)。アップロード ID は、マルチパートアップロードを初期化するために InitiateMultipartUpload 操作が呼び出された後に返されます。
        String uploadId = "0004B999EF518A1FE585B0C9360D****";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();
        
        try {
            // マルチパートアップロードをキャンセルします。
            AbortMultipartUploadRequest abortMultipartUploadRequest =
                    new AbortMultipartUploadRequest(bucketName, objectName, uploadId);
            ossClient.abortMultipartUpload(abortMultipartUploadRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

アップロード済みパートのリスト表示

`InitiateMultipartUpload` を呼び出した後、`CompleteMultipartUpload` を呼び出す前に返されるアップロード ID を取得することで、アップロード済みのパートをリスト表示できます。次に、そのアップロード ID を使用して `listParts` メソッドを呼び出し、指定されたアップロード ID に対して正常にアップロードされたすべてのパートをリスト表示します。

アップロード済みパートのリスト表示

次のコードスニペットは、アップロード済みのパートをリスト表示する方法を示しています。

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 {
        // 例として、中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します (例: examplebucket)。
        String bucketName = "examplebucket";
        // オブジェクトのフルパスを指定します (例: exampledir/exampleobject.txt)。フルパスにバケット名を含めることはできません。
        String objectName = "exampledir/exampleobject.txt";
        // アップロード ID を指定します (例: 0004B999EF518A1FE585B0C9360D****)。アップロード ID は、マルチパートアップロードを初期化するために InitiateMultipartUpload 操作が呼び出され、マルチパートアップロードを完了するために CompleteMultipartUpload 操作が呼び出される前に返されます。
        String uploadId = "0004B999EF518A1FE585B0C9360D****";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();
        
        try {
            // アップロードされたパートをリスト表示します。
            ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId);
            // アップロード ID を設定します。
            //listPartsRequest.setUploadId(uploadId);
            // ページングのために各ページのパート数を 100 に設定します。デフォルトでは、1,000 パートがリスト表示されます。
            listPartsRequest.setMaxParts(100);
            // リスト操作の開始位置を指定します。このパラメーター値より大きいパート番号を持つパートのみがリスト表示されます。
            listPartsRequest.setPartNumberMarker(2);
            PartListing partListing = ossClient.listParts(listPartsRequest);

            for (PartSummary part : partListing.getParts()) {
                // パート番号を取得します。
                System.out.println(part.getPartNumber());
                // パートのデータサイズを取得します。
                System.out.println(part.getSize());
                // パートの ETag を取得します。
                System.out.println(part.getETag());
                // パートの最終更新時刻を取得します。
                System.out.println(part.getLastModified());
            }
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

アップロード済みのすべてのパートのリスト表示

デフォルトでは、`listParts` メソッドを呼び出すことで一度に最大 1,000 パートをリスト表示できます。パート数が 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 {
        // 例として、中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します (例: examplebucket)。
        String bucketName = "examplebucket";
        // オブジェクトのフルパスを指定します (例: exampledir/exampleobject.txt)。フルパスにバケット名を含めることはできません。
        String objectName = "exampledir/exampleobject.txt";
        // アップロード ID を指定します (例: 0004B999EF518A1FE585B0C9360D****)。アップロード ID は、マルチパートアップロードを初期化するために InitiateMultipartUpload 操作が呼び出され、マルチパートアップロードを完了するために CompleteMultipartUpload 操作が呼び出される前に返されます。
        String uploadId = "0004B999EF518A1FE585B0C9360D****";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();
        
        try {
            // アップロードされたすべてのパートをリスト表示します。
            PartListing partListing;
            ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId);

            do {
                partListing = ossClient.listParts(listPartsRequest);

                for (PartSummary part : partListing.getParts()) {
                    // パート番号を取得します。
                    System.out.println(part.getPartNumber());
                    // パートのデータサイズを取得します。
                    System.out.println(part.getSize());
                    // パートの ETag を取得します。
                    System.out.println(part.getETag());
                    // パートの最終更新時刻を取得します。
                    System.out.println(part.getLastModified());
                }
                // リスト操作の開始位置を指定します。このパラメーター値より大きいパート番号を持つパートのみがリスト表示されます。
                listPartsRequest.setPartNumberMarker(partListing.getNextPartNumberMarker());
            } while (partListing.isTruncated());
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

アップロード済みのすべてのパートのページ単位でのリスト表示

次のコードスニペットは、各ページのパート数を指定し、すべてのパートをページ単位でリスト表示する方法を示しています。

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 {
        // 例として、中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します (例: examplebucket)。
        String bucketName = "examplebucket";
        // オブジェクトのフルパスを指定します (例: exampledir/exampleobject.txt)。フルパスにバケット名を含めることはできません。
        String objectName = "exampledir/exampleobject.txt";
        // アップロード ID を指定します (例: 0004B999EF518A1FE585B0C9360D****)。アップロード ID は、マルチパートアップロードを初期化するために InitiateMultipartUpload 操作が呼び出され、マルチパートアップロードを完了するために CompleteMultipartUpload 操作が呼び出される前に返されます。
        String uploadId = "0004B999EF518A1FE585B0C9360D****";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();
        
        try {
            // アップロードされたパートをページ単位でリスト表示します。
            PartListing partListing;
            ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId);
            // ページ分割リストのために、各ページにリスト表示するパートの数を 100 に設定します。
            listPartsRequest.setMaxParts(100);

            do {
                partListing = ossClient.listParts(listPartsRequest);

                for (PartSummary part : partListing.getParts()) {
                    // パート番号を取得します。
                    System.out.println(part.getPartNumber());
                    // パートのデータサイズを取得します。
                    System.out.println(part.getSize());
                    // パートの ETag を取得します。
                    System.out.println(part.getETag());
                    // パートの最終更新時刻を取得します。
                    System.out.println(part.getLastModified());
                }

                listPartsRequest.setPartNumberMarker(partListing.getNextPartNumberMarker());

            } while (partListing.isTruncated());
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}                    

マルチパートアップロードイベントのリスト表示

`listMultipartUploads` メソッドを呼び出して、進行中のすべてのマルチパートアップロードイベントをリスト表示できます。進行中のマルチパートアップロードイベントとは、初期化されたがまだ完了またはキャンセルされていないイベントです。設定可能なパラメーターは次の表で説明します。

パラメーター

機能

メソッド

prefix

返されるファイル名が指定されたプレフィックスを持つ必要があることを指定します。プレフィックスでクエリを実行する場合、返されるファイル名にはプレフィックスが引き続き含まれることに注意してください。

ListMultipartUploadsRequest.setPrefix(String prefix)

delimiter

ファイル名をグループ化するために使用される文字。指定されたプレフィックスを含み、デリミタ文字の間で初めて出現するすべてのファイル名は、要素のグループとして扱われます。

ListMultipartUploadsRequest.setDelimiter(String delimiter)

maxUploads

返すマルチパートアップロードイベントの最大数。デフォルト値と最大値は 1,000 です。

ListMultipartUploadsRequest.setMaxUploads(Integer maxUploads)

keyMarker

名前が `keyMarker` パラメーターの値より辞書順で大きいファイルのマルチパートアップロードイベント。このパラメーターは `uploadIdMarker` パラメーターと共に使用され、返される結果の開始位置を指定します。

ListMultipartUploadsRequest.setKeyMarker(String keyMarker)

uploadIdMarker

`keyMarker` パラメーターと共に使用され、返される結果の開始位置を指定します。`keyMarker` パラメーターが設定されていない場合、このパラメーターは無効です。`keyMarker` パラメーターが設定されている場合、クエリ結果には以下が含まれます。

  • 名前が `keyMarker` パラメーターの値より辞書順で大きいすべてのファイル。

  • 名前が `keyMarker` パラメーターの値と同じで、アップロード ID が `uploadIdMarker` パラメーターの値より大きいファイルのすべてのマルチパートアップロードイベント。

ListMultipartUploadsRequest.setUploadIdMarker(String uploadIdMarker)

マルチパートアップロードイベントのリスト表示

次のコードスニペットは、マルチパートアップロードイベントをリスト表示する方法を示しています。

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 {
        // 例として、中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します (例: examplebucket)。
        String bucketName = "examplebucket";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();
        
        try {
            // マルチパートアップロードイベントをリスト表示します。デフォルトでは、1,000 パートがリスト表示されます。
            ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);
            MultipartUploadListing multipartUploadListing = ossClient.listMultipartUploads(listMultipartUploadsRequest);

            for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
                // アップロード ID を取得します。
                System.out.println(multipartUpload.getUploadId());
                // キーを取得します。
                System.out.println(multipartUpload.getKey());
                // マルチパートアップロードの初期化時刻を取得します。
                System.out.println(multipartUpload.getInitiated());
            }
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

レスポンスの `isTruncated` の値が true の場合、`nextKeyMarker` と `nextUploadIdMarker` が返され、次のリスト操作の開始点を示します。すべてのアップロードイベントを一度に取得できない場合は、ページ単位でリスト表示できます。

すべてのマルチパートアップロードイベントのリスト表示

デフォルトでは、`listMultipartUploads` メソッドを呼び出すことで一度に最大 1,000 件のマルチパートアップロードイベントをリスト表示できます。イベント数が 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 {
        // 例として、中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します (例: examplebucket)。
        String bucketName = "examplebucket";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();
        
        try {
            // マルチパートアップロードイベントをリスト表示します。
            MultipartUploadListing multipartUploadListing;
            ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);

            do {
                multipartUploadListing = ossClient.listMultipartUploads(listMultipartUploadsRequest);

                for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
                    // アップロード ID を取得します。
                    System.out.println(multipartUpload.getUploadId());
                    // ファイル名を取得します。
                    System.out.println(multipartUpload.getKey());
                    // マルチパートアップロードの初期化時刻を取得します。
                    System.out.println(multipartUpload.getInitiated());
                }

                listMultipartUploadsRequest.setKeyMarker(multipartUploadListing.getNextKeyMarker());

                listMultipartUploadsRequest.setUploadIdMarker(multipartUploadListing.getNextUploadIdMarker());
            } while (multipartUploadListing.isTruncated());
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

すべてのアップロードイベントのページ単位でのリスト表示

次のコードスニペットは、すべてのアップロードイベントをページ単位でリスト表示する方法を示しています。

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 {
        // 例として、中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します (例: examplebucket)。
        String bucketName = "examplebucket";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();
        
        try {
            // マルチパートアップロードイベントをリスト表示します。
            MultipartUploadListing multipartUploadListing;
            ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);
            // 各ページにリスト表示するマルチパートアップロードイベントの数を設定します。
            listMultipartUploadsRequest.setMaxUploads(50);

            do {
                multipartUploadListing = ossClient.listMultipartUploads(listMultipartUploadsRequest);

                for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
                    // アップロード ID を取得します。
                    System.out.println(multipartUpload.getUploadId());
                    // キーを取得します。
                    System.out.println(multipartUpload.getKey());
                    // マルチパートアップロードの初期化時刻を取得します。
                    System.out.println(multipartUpload.getInitiated());
                }

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

            } while (multipartUploadListing.isTruncated());
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

ネットワークストリームまたはデータストリームのマルチパートアップロードの実行

このトピックでは、ローカルファイルのマルチパートアップロードを実行する方法の例を示します。ネットワークストリームまたはデータストリームのマルチパートアップロードを実行する方法の詳細については、「データストリームのマルチパートアップロード」をご参照ください。

関連ドキュメント

  • マルチパートアップロードの完全なサンプルコードについては、「GitHub の例」をご参照ください。

  • マルチパートアップロードには 3 つの API 操作が含まれます。操作の詳細については、次のトピックをご参照ください。

  • マルチパートアップロードイベントをキャンセルするために使用される API 操作の詳細については、「AbortMultipartUpload」をご参照ください。

  • アップロードされたパートをリスト表示するために使用される API 操作の詳細については、「ListParts」をご参照ください。

  • 進行中のすべてのマルチパートアップロードイベントをリスト表示するために使用される API 操作の詳細については、「ListMultipartUploads」をご参照ください。