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

Object Storage Service:マルチパートアップロード

最終更新日:Mar 11, 2024

Object Storage Service (OSS) は、マルチパートアップロード機能を提供します。 マルチパートアップロードを使用すると、大きなオブジェクトを複数のパートに分割してアップロードできます。 これらのパーツがアップロードされたら、CompleteMultipartUpload操作を呼び出して、パーツを完全なオブジェクトに結合できます。

使用上の注意

  • このトピックのサンプルコードを実行する前に、カスタムドメイン名やSecurity Token Service (STS) などの方法を使用してOSSClientインスタンスを作成する必要があります。 詳細については、「初期化」をご参照ください。

処理中

マルチパートアップロードを使用してオブジェクトをアップロードするには、次の手順を実行します。

  1. マルチパートアップロードタスクを開始します。

    oss.initMultipartUploadメソッドを呼び出して、OSSに一意のアップロードIDを作成します。

  2. パーツをアップロード

    oss.uploadPartメソッドを呼び出して、パーツをアップロードします。

    説明
    • 特定のアップロードIDを持つマルチパートアップロードタスクによってパーツがアップロードされる場合、オブジェクト内のパーツの相対位置を識別するためにパーツ番号が使用されます。 既存の部品と同じ部品番号を持つ部品をアップロードすると、既存の部品はアップロードされた部品によって上書きされます。

    • OSSは、レスポンスのETagヘッダーにアップロードされた各パーツのMD5ハッシュを含めます。

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

  3. マルチパートアップロードタスクを完了します。

    すべてのパーツをアップロードしたら、oss.CompleteMultipartUploadメソッドを呼び出して、パーツを完全なオブジェクトに結合します。

完全なサンプルコード

次のサンプルコードは、マルチパートアップロードプロセスに従ってマルチパートアップロードタスクを実装する方法の例を示しています。

// バケットの名前を指定します。 例: examplebucket. 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
文字列objectName = "exampledir/exampleobject.txt";
// ローカルファイルのフルパスを指定します。 例: /storage/emulated/0/oss/examplefile.txt 
文字列localFilepath = "/storage/emulated/0/oss/examplefile.txt";

// マルチパートアップロードタスクを開始します。 
InitiateMultipartUploadRequest init = new InitiateMultipartUploadRequest(bucketName, objectName);
InitiateMultipartUploadResult initResult = oss.initMultipartUpload(init);
// アップロードIDを取得します。 
文字列uploadId = initResult.getUploadId();
// マルチパートアップロードタスクをキャンセルするか、アップロードIDに基づいてアップロードされたパーツをリストします。 
// アップロードIDに基づいてマルチパートアップロードタスクをキャンセルする場合は、InitiateMultipartUpload操作を呼び出してマルチパートアップロードタスクを開始した後にアップロードIDを取得します。  
// アップロードIDに基づいてマルチパートアップロードタスクでアップロードされたパーツを一覧表示する場合は、InitiateMultipartUpload操作を呼び出してマルチパートアップロードタスクを開始した後、CompleteMultipartUpload操作を呼び出してマルチパートアップロードタスクを完了する前に、アップロードIDを取得します。 
// Log.d("uploadId", uploadId);

// パーツサイズを指定します。 単位:バイト 有効な値: 100 KB〜5 GB。 
int partCount = 100*1024;
// マルチパートアップロードタスクを開始します。 
リスト <PartETag> partETags = new ArrayList<>();
for (int i = 1; i < 5; i ++) {
    byte[] data = new byte[partCount];

    RandomAccessFile raf=新しいRandomAccessFile(localFilepath、"r");
    long skip = (i-1) * partCount;
    raf.seek (スキップ);
    raf.readFully (データ、0、partCount);

    UploadPartRequest uploadPart = new UploadPartRequest();
    uploadPart.setBucketName(bucketName);
    uploadPart.setObjectKey(objectName);
    uploadPart.setUploadId(uploadId);
    // 各パーツのパーツ番号を指定します。 番号は1から始まります。 各部品は部品番号を有する。 有効な値: 1 ~ 10000 
    uploadPart.setPartNumber(i); 
    uploadPart.setPartContent (データ);
    try {
        UploadPartResult result = oss.uploadPart(uploadPart);
        PartETag partETag = new PartETag(uploadPart.getPartNumber(), result.getETag());
        partETags.add(partETag);
    } catch (ServiceException serviceException) {
        OSSLog.logError(serviceException.getErrorCode());
    }
}
Collections.sort(partETags, new Comparator<PartETag>() {
    @オーバーライド
    public int compare(PartETag lhs, PartETag rhs) {
        if (lhs.getPartNumber() < rhs.getPartNumber()) {
            return -1;
        } else if (lhs.getPartNumber() > rhs.getPartNumber()) {
            return 1;
        } else {
            return 0;
        }
    }
});

// マルチパートアップロードタスクを完了します。 
CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest(bucketName、objectName、uploadId、partETags);

// アップロードコールバックを実装します。 マルチパートアップロードタスクの完了時に、CALLBACK_SERVERパラメーターを設定できます。 マルチパートアップロードタスクが完了すると、指定されたサーバーアドレスにコールバックリクエストが送信されます。 servercallbackの結果は、レスポンスのcompleteResult.getServerCallbackReturnBody() で表示できます。 
complete.setCallbackParam(new HashMap<String, String>() {
    {
        put("callbackUrl", CALLBACK_SERVER); // CALLBACK_SERVERパラメーターをサーバーアドレスに設定します。 
        put("callbackBody" 、"test");
    }
});
CompleteMultipartUploadResult completeResult = oss.com pleteMultipartUpload(complete);
OSSLog.logError("------------ serverCallback: " + completeResult.getServerCallbackReturnBody()); 

上記のコードでは、uploadPartを使用して各パーツをアップロードします。

  • マルチパートアップロードタスクごとにアップロードIDと部品番号を指定する必要があります。 PartNumberの有効値の範囲は1から10000です。 部品番号がこの範囲内にない場合、InvalidArgumentエラーコードが返されます。

  • uploadPartを使用する場合、パートは最後のパートを除いて100 KBより大きくなければなりません。 uploadPartを使用する場合、すべてのパーツがアップロードされた後にのみ、各パーツのサイズが検証されます。

  • パーツをアップロードするたびに、ストリームがパーツの開始位置に向けられていることを確認します。

  • 部品がアップロードされるたびに、部品のETag値を含むレスポンスが返されます。 ETag値がMD5ハッシュと同じ場合は、ETag値と部品番号を組み合わせてPartETagにし、その後の部品のアップロードのためにPartETagを保存します。

マルチパートアップロードを使用してローカルファイルをアップロードする

同期モードまたは非同期モードでマルチパートアップロードを使用して、ローカルファイルをOSSにアップロードできます。

説明

上記の完全なサンプルコードは、マルチパートアップロードプロセスに従ってマルチパートアップロードタスクを実装するために使用されます。 このセクションの完全なサンプルコードは、マルチパートアップロードを使用してローカルファイルをアップロードするためにカプセル化されています。 この方法では、MultipartUploadRequestを使用して、ローカルファイルのマルチパートアップロードタスクを実装するだけです。

  • 同期モードでマルチパートアップロードを使用してローカルファイルをアップロードする

    次のサンプルコードは、同期モードでマルチパートアップロードを使用して、examplebucketバケットのexampledirディレクトリにあるexampleobject.txtオブジェクトにexamplefile.txtという名前のローカルファイルをアップロードする方法の例を示しています。

    // バケットの名前を指定します。 例: examplebucket. 
    String bucketName = "examplebucket";
    // オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
    文字列objectName = "exampledir/exampleobject.txt";
    // ローカルファイルのフルパスを指定します。 例: /storage/emulated/0/oss/examplefile.txt 
    文字列localFilepath = "/storage/emulated/0/oss/examplefile.txt";
    
    ObjectMetadata meta = new ObjectMetadata();
    // オブジェクトメタデータを設定します。 
    meta.setHeader("x-oss-object-acl" 、"public-read-write");
    MultipartUploadRequest rq = new MultipartUploadRequest(bucketName, objectName, localFilepath, meta);
    // パーツサイズを指定します。 PartSizeのデフォルト値は256 KBです。 最小値は100 KBです。 
    rq.setPartSize(1024*1024);
    rq.setProgressCallback(new OSSProgressCallback<MultipartUploadRequest>() {
        @オーバーライド
        public void onProgress(MultipartUploadRequestリクエスト, long currentSize, long totalSize) {
            OSSLog.logDebug("[testMultipartUpload] - " + currentSize + "" + totalSize、false);
        }
    });
    
    CompleteMultipartUploadResult result = oss.multipartUpload(rq); 

    Android 10以降のスコープ付きストレージでは、ファイルのURI (Uniform Resource Identifier) を使用して、ファイルをOSSにアップロードできます。

    // バケットの名前を指定します。 例: examplebucket. 
    String bucketName = "examplebucket";
    // オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
    文字列objectName = "exampledir/exampleobject.txt";
    
    ObjectMetadata meta = new ObjectMetadata();
    // オブジェクトメタデータを設定します。 
    meta.setHeader("x-oss-object-acl" 、"public-read-write");
    MultipartUploadRequest rq = new MultipartUploadRequest(bucketName, objectName, fileUri, meta);
    // パーツサイズを指定します。 PartSizeのデフォルト値は256 KBです。 最小値は100 KBです。 
    rq.setPartSize(1024*1024);
    rq.setProgressCallback(new OSSProgressCallback<MultipartUploadRequest>() {
        @オーバーライド
        public void onProgress(MultipartUploadRequestリクエスト, long currentSize, long totalSize) {
            OSSLog.logDebug("[testMultipartUpload] - " + currentSize + "" + totalSize、false);
        }
    });
    
    CompleteMultipartUploadResult result = oss.multipartUpload(rq); 
  • 非同期モードでマルチパートアップロードを使用してローカルファイルをアップロードする

    次のサンプルコードは、非同期モードでマルチパートアップロードを使用して、examplebucketバケットのexampledirディレクトリにあるexampleobject.txtオブジェクトにexamplefile.txtという名前のローカルファイルをアップロードする方法の例を示しています。

    // バケットの名前を指定します。 例: examplebucket. 
    String bucketName = "examplebucket";
    // オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
    文字列objectName = "exampledir/exampleobject.txt";
    // ローカルファイルのフルパスを指定します。 例: /storage/emulated/0/oss/examplefile.txt 
    文字列localFilepath = "/storage/emulated/0/oss/examplefile.txt";
    
    MultipartUploadRequest request = new MultipartUploadRequest(bucketName, objectName, localFilepath);
    
    request.setProgressCallback(new OSSProgressCallback<MultipartUploadRequest>() {
        @オーバーライド
        public void onProgress(MultipartUploadRequestリクエスト, long currentSize, long totalSize) {
            OSSLog.logDebug("[testMultipartUpload] - " + currentSize + "" + totalSize、false);
        }
    });
    
    OSSAsyncTask task = oss.asyncMultipartUpload(request, new OSSCompletedCallback<MultipartUploadRequest, CompleteMultipartUploadResult>() {
        @オーバーライド
        public void onSuccess(MultipartUploadRequestリクエスト, CompleteMultipartUploadResult結果) {
            OSSLog.logInfo(result.getServerCallbackReturnBody());
        }
    
        @オーバーライド
        public void onFailure(MultipartUploadRequestリクエスト, ClientException clientException, ServiceException serviceException) {
            OSSLog.logError(serviceException.getRawMessage());
        }
    });
    
    // Thread.sleep(100);
    // マルチパートアップロードタスクをキャンセルします。 
    // task.ca ncel();
    
    task.waitUntilFinished(); 

    Android 10以降のスコープ付きストレージでは、ファイルのURIを使用してファイルをOSSにアップロードできます。

    // バケットの名前を指定します。 例: examplebucket. 
    String bucketName = "examplebucket";
    // オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
    文字列objectName = "exampledir/exampleobject.txt";
    
    MultipartUploadRequest request = new MultipartUploadRequest(bucketName, objectName, fileUri);
    
    request.setProgressCallback(new OSSProgressCallback<MultipartUploadRequest>() {
        @オーバーライド
        public void onProgress(MultipartUploadRequestリクエスト, long currentSize, long totalSize) {
            OSSLog.logDebug("[testMultipartUpload] - " + currentSize + "" + totalSize、false);
        }
    });
    
    OSSAsyncTask task = oss.asyncMultipartUpload(request, new OSSCompletedCallback<MultipartUploadRequest, CompleteMultipartUploadResult>() {
        @オーバーライド
        public void onSuccess(MultipartUploadRequestリクエスト, CompleteMultipartUploadResult結果) {
            OSSLog.logInfo(result.getServerCallbackReturnBody());
        }
    
        @オーバーライド
        public void onFailure(MultipartUploadRequestリクエスト, ClientException clientException, ServiceException serviceException) {
            OSSLog.logError(serviceException.getRawMessage());
        }
    });
    
    // Thread.sleep(100);
    // マルチパートアップロードタスクをキャンセルします。 
    // task.ca ncel();
    
    task.waitUntilFinished(); 

アップロードしたパーツの一覧表示

oss.listPartsメソッドを呼び出して、マルチパートアップロードタスクでアップロードされたすべてのパーツを取得できます。

次のサンプルコードは、アップロードされたパーツを一覧表示する方法の例です。

// バケットの名前を指定します。 例: examplebucket. 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
文字列objectName = "exampledir/exampleobject.txt";
// アップロードIDを指定します。 InitiateMultipartUpload操作の応答からアップロードIDを取得できます。 CompleteMultipartUpload操作を呼び出してマルチパートアップロードタスクを完了する前に、アップロードIDを取得する必要があります。 
文字列uploadId = "0004B999EF518A1FE585B0C9 ****";

// アップロードしたパーツを一覧表示します。 
ListPartsRequest listParts = new ListPartsRequest(bucketName、objectName、uploadId);
ListPartsResult result = oss.listParts(listParts);

List<PartETag> partETagList = new ArrayList<PartETag>();
for (PartSummary part : result.getParts()) {
    partETagList.add(new PartETag(part.getPartNumber(), part.getETag()));
} 
重要

デフォルトでは、マルチパートアップロードを使用してアップロードされた1,000を超えるパーツがバケットに含まれている場合、最初の1,000パーツが返されます。 応答では、IsTruncatedフィールドがfalseに設定され、NextPartNumberMarkerが返されて、データが読み取られる次の開始位置を示します。

マルチパートアップロードタスクのキャンセル

oss.abortMultipartUploadメソッドを呼び出して、マルチパートアップロードタスクをキャンセルできます。 マルチパートアップロードタスクをキャンセルした場合、アップロードIDを使用してマルチパート操作を実行できません。 アップロードされたパーツは削除されます。

次のサンプルコードは、マルチパートアップロードタスクをキャンセルする方法の例を示しています。

// バケットの名前を指定します。 例: examplebucket. 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
文字列objectName = "exampledir/exampleobject.txt";
// アップロードIDを指定します。 InitiateMultipartUpload操作の応答からアップロードIDを取得できます。 
文字列uploadId = "0004B999EF518A1FE585B0C9 ****";

// マルチパートアップロードタスクをキャンセルします。 
AbortMultipartUploadRequest abort = new AbortMultipartUploadRequest(bucketName、objectName、uploadId);
AbortMultipartUploadResult abortResult = oss.abortMultipartUpload(abort); 

参考資料

  • マルチパートアップロードの実行に使用する完全なサンプルコードについては、『GitHub』をご参照ください。

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

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

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

  • 実行中のすべてのマルチパートアップロードタスクを一覧表示するために呼び出すことができるAPI操作の詳細については、「ListMultipartUploads」をご参照ください。 進行中のマルチパートアップロードタスクは、開始されたが完了またはキャンセルされていないタスクです。

  • OSSClientインスタンスを初期化する方法の詳細については、「初期化」をご参照ください。