Object Storage Service (OSS) は、マルチパートアップロード機能を提供します。 マルチパートアップロードを使用すると、大きなオブジェクトを複数のパートに分割してアップロードできます。 これらのパーツがアップロードされたら、CompleteMultipartUpload操作を呼び出して、パーツを完全なオブジェクトに結合できます。
使用上の注意
このトピックのサンプルコードを実行する前に、カスタムドメイン名やSecurity Token Service (STS) などの方法を使用してOSSClientインスタンスを作成する必要があります。 詳細については、「初期化」をご参照ください。
処理中
マルチパートアップロードを使用してオブジェクトをアップロードするには、次の手順を実行します。
マルチパートアップロードタスクを開始します。
oss.initMultipartUploadメソッドを呼び出して、OSSに一意のアップロードIDを作成します。
パーツをアップロード
oss.uploadPartメソッドを呼び出して、パーツをアップロードします。
説明特定のアップロードIDを持つマルチパートアップロードタスクによってパーツがアップロードされる場合、オブジェクト内のパーツの相対位置を識別するためにパーツ番号が使用されます。 既存の部品と同じ部品番号を持つ部品をアップロードすると、既存の部品はアップロードされた部品によって上書きされます。
OSSは、レスポンスのETagヘッダーにアップロードされた各パーツのMD5ハッシュを含めます。
OSSは、アップロードされたデータのMD5ハッシュを計算し、MD5ハッシュをOSS SDK for Javaによって計算されたMD5ハッシュと比較します。 2つのハッシュが異なる場合、OSSはInvalidDigestエラーコードを返します。
マルチパートアップロードタスクを完了します。
すべてのパーツをアップロードしたら、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インスタンスを初期化する方法の詳細については、「初期化」をご参照ください。