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

Object Storage Service:クラウドボックスの OSS のマルチパートアップロード

最終更新日:Nov 09, 2025

クラウドボックスの OSS はマルチパートアップロードをサポートしています。オブジェクトを複数のパートに分割して、個別にアップロードできます。すべてのパートがアップロードされた後、CompleteMultipartUpload 操作を呼び出して、これらのパートを完全なオブジェクトに結合できます。

前提条件

クラウドボックスの OSS バケットが作成されていること。詳細については、「クラウドボックスの OSS バケットを作成する」をご参照ください。

シナリオ

  • ラージオブジェクトのアップロードの高速化: サイズが 5 GB を超えるオブジェクトをアップロードする場合、マルチパートアップロードを使用してオブジェクトを複数のパートに分割し、パートを並行してアップロードすることでアップロードを高速化できます。

  • ネットワークジッター: マルチパートアップロードは、ネットワーク状態が悪いシナリオに適しています。特定のパートのアップロードに失敗した場合、そのパートのみを再アップロードすればよいため、時間と帯域幅を節約できます。

  • アップロードの一時停止と再開: マルチパートアップロードタスクは有効期限が切れません。タスクが完了またはキャンセルされる前であれば、いつでもマルチパートアップロードタスクを一時停止および再開できます。

  • 不明なオブジェクトサイズ: ビデオ監視などのシナリオでは、最終的なオブジェクトサイズが不明な場合があります。この場合、マルチパートアップロードを使用してオブジェクトをアップロードできます。

プロセス

マルチパートアップロードを使用してローカルファイルをアップロードするには、次の手順を実行します:

  1. InitiateMultipartUpload 操作を呼び出して、マルチパートアップロードタスクを開始します。

  2. UploadPart 操作を呼び出して、パートをアップロードします。

    • アップロードするオブジェクトのパートは、アップロード時に指定したパート番号に基づいてソートされます。ただし、パートを順番にアップロードする必要はなく、並行してアップロードできます。並行アップロード数を増やしても、必ずしもアップロードが高速化されるわけではありません。ネットワークの状態とデバイスのワークロードに基づいて、並行アップロード数を指定することをお勧めします。

    • デフォルトでは、オブジェクトのパートをアップロードしても、CompleteMultipartUpload 操作を呼び出してパートをオブジェクトに結合しない場合、アップロードされたパートは自動的に削除されません。アップロードタスクをキャンセルしてパートを削除するには、AbortMultipartUpload 操作を呼び出します。

  3. CompleteMultipartUpload 操作を呼び出して、アップロードされたパートをオブジェクトに結合します。

制限事項

制限

説明

オブジェクトのサイズ

最大 48.8 TB。

パート数

1 から 10000。

パートのサイズ

100 KB から 5 GB。最後のパートのサイズは 100 KB 未満でもかまいません。

1 回の ListParts リクエストで返されるパートの最大数

1,000

1 回の ListMultipartUploads リクエストで返されるマルチパートアップロードタスクの最大数

1,000

使用上の注意

  • アップロードパフォーマンスの最適化

    タイムスタンプや文字など、連続したプレフィックスを含む名前のオブジェクトを多数アップロードすると、これらのオブジェクトのインデックスがバケットの同じパーティションに保存される場合があります。これらのオブジェクトをクエリするために多数のリクエストが送信されると、リクエストレートが低下する可能性があります。この問題を回避するには、多数のオブジェクトをアップロードするときに、オブジェクト名に連続したプレフィックスを使用しないでください。詳細については、「OSS パフォーマンスのベストプラクティス」をご参照ください。

  • オブジェクトの上書き

    既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、既存のオブジェクトが上書きされます。次の方法で、オブジェクトが誤って上書きされるのを防ぐことができます:

    • バージョン管理の有効化

      バージョン管理を有効にすると、上書きされたオブジェクトは以前のバージョンとして保存されます。以前のバージョンはいつでも復元できます。詳細については、「クラウドボックスの OSS のバージョン管理」をご参照ください。

    • 同じ名前のオブジェクトが上書きされるのを防ぐために使用されるヘッダーをリクエストに含める: アップロードリクエストに x-oss-forbid-overwrite ヘッダーを含め、ヘッダーを true に設定します。これにより、既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、アップロードは失敗し、FileAlreadyExists エラーが返されます。詳細については、「InitiateMultipartUpload」をご参照ください。

  • パートの削除

    マルチパートアップロードが中断されると、アップロードされたパートはバケットに残ります。これらのパートが不要になった場合は、ライフサイクルルールを設定して自動的に削除できます。詳細については、「クラウドボックスの OSS のライフサイクルルール」をご参照ください。

手順

Alibaba Cloud SDK の使用

マルチパートアップロードは、Alibaba Cloud SDK for Java バージョン 3.15.0 以降でのみサポートされています。

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
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;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;

public class Demo {

    public static void main(String[] args) throws Exception {
        // クラウドボックスの OSS バケットのデータエンドポイントを指定します。
        String endpoint = "https://cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com";
        // 環境変数からアクセス資格情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // クラウドボックスの OSS バケットの名前 (例: examplebucket) を指定します。
        String bucketName = "examplebucket";
        // クラウドボックスの OSS バケットが配置されているリージョンを指定します。
        String region = "cn-hangzhou";
        // CloudBox の ID を指定します。
        String cloudBoxId = "cb-f8z7yvzgwfkl9q0h****";
        // オブジェクトの完全なパス (例: exampledir/exampleobject.txt) を指定します。完全なパスにバケット名を含めることはできません。
        String objectName = "exampledir/exampleobject.txt";

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

        try {
            // 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);
            // オブジェクトの暗号化アルゴリズムを指定します。このパラメーターを指定しない場合、AES-256 アルゴリズムが使用されます。
            // 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);
            // オブジェクトに 1 つ以上のタグを指定します。
            // metadata.setHeader(OSSHeaders.OSS_TAGGING, "a:1");
            // request.setObjectMetadata(metadata);

            // マルチパートアップロードを初期化します。
            InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
            // upload ID が返されます。これは、マルチパートアップロードイベントの一意の識別子です。upload ID を使用して、マルチパートアップロードのキャンセルやクエリなどの関連操作を実行できます。
            String uploadId = upresult.getUploadId();

            // partETags は PartETag オブジェクトのコレクションです。PartETag は、パートの ETag とパート番号で構成されます。
            List<PartETag> partETags =  new ArrayList<PartETag>();
            // 各パートのサイズ (バイト単位)。これはパート数を計算するために使用されます。
            final long partSize = 1 * 1024 * 1024L;   // 1 MB。

            // ローカルファイルの完全なパスを指定します。ローカルパスを指定しない場合、ファイルはサンプルプログラムが属するプロジェクトのパスからアップロードされます。
            final File sampleFile = new File("D:\\localpath\\examplefile.txt");
            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;
                InputStream instream = new FileInputStream(sampleFile);
                // アップロード済みのパートをスキップします。
                instream.skip(startPos);
                UploadPartRequest uploadPartRequest = new UploadPartRequest();
                uploadPartRequest.setBucketName(bucketName);
                uploadPartRequest.setKey(objectName);
                uploadPartRequest.setUploadId(uploadId);
                uploadPartRequest.setInputStream(instream);
                // パートサイズを設定します。最後のパートを除き、各パートの最小サイズは 100 KB です。
                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());
            }


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

            // マルチパートアップロードを完了するときにオブジェクトのアクセス権限を設定するには、次のサンプルコードを参照してください。
            // completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.Private);
            // 現在の upload ID でアップロードされたすべてのパートをリストするかどうかを指定します。サーバー上のパートをリストして完全なオブジェクトにマージする場合、CompleteMultipartUploadRequest の partETags は null にすることができます。
            // Map<String, String> headers = new HashMap<String, String>();
            // x-oss-complete-all を yes に設定すると、OSS は現在の upload ID でアップロードされたすべてのパートをリストし、パート番号でソートしてから、マルチパートアップロードを完了します。
            // x-oss-complete-all を yes に設定した場合、本文を指定することはできません。指定すると、エラーが報告されます。
            // headers.put("x-oss-complete-all","yes");
            // completeMultipartUploadRequest.setHeaders(headers);

            // マルチパートアップロードを完了します。
            CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
            System.out.println(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 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();
            }
        }
    }
}

ossutil の使用

ossutil コマンドラインインターフェイス 2.0 が提供する cp コマンドを実行して大きなローカルファイルをアップロードすると、ossutil は自動的にマルチパートアップロードを使用してローカルファイルをアップロードします。

ossutil cp D:/localpath/example.iso oss://examplebucket/desfolder/

マルチパートアップロードを使用してローカルファイルを手動でアップロードするには、initiate-multipart-uploadupload-part、および complete-multipart-upload 操作を一緒に使用できます。

API 操作

上記の方法は、基本的に RESTful API に基づいて実装されています。ビジネスで高度なカスタマイズが必要な場合は、RESTful API を直接呼び出すことができます。API を直接呼び出すには、署名計算をコードに含める必要があります。

  • マルチパートアップロードタスクを開始するために呼び出すことができる API 操作の詳細については、「InitiateMultipartUpload」をご参照ください。

  • パートをアップロードするために呼び出すことができる API 操作の詳細については、「UploadPart」をご参照ください。

  • 既存のオブジェクトからデータをコピーしてパートをアップロードするために呼び出すことができる API 操作の詳細については、「UploadPartCopy」をご参照ください。

  • マルチパートアップロードタスクを完了するために呼び出すことができる API 操作の詳細については、「CompleteMultipartUpload」をご参照ください。

  • マルチパートアップロードタスクをキャンセルし、タスクで生成されたパートを削除するために呼び出すことができる API 操作の詳細については、「AbortMultipartUpload」をご参照ください。

  • 進行中のすべてのマルチパートアップロードタスクをリストするために呼び出すことができる API 操作の詳細については、「ListMultipartUploads」をご参照ください。

  • アップロードされたすべてのパートをリストするために呼び出すことができる API 操作の詳細については、「ListParts」をご参照ください。