マルチパートアップロードによるファイルのアップロード方法について説明します。
マルチパートアップロードを初期化する
String uploadId;
InitiateMultipartUploadRequest init = new InitiateMultipartUploadRequest("<bucketName>", "<objectKey>");
InitiateMultipartUploadResult initResult = oss.initMultipartUpload(init);
uploadId = initResult.getUploadId();
InitiateMultipartUploadRequestは、アップロードするファイルの名前とバケットを指定するために使用します。
InitiateMultipartUploadRequestでは、ObjectMetaを設定できますが、ContentLengthを指定する必要はありません。
InitiateMultipartUploadによって返される結果には、マルチパートアップロードタスクを一意に識別し、後続の操作で使用されるアップロードIDを含みます。
部品をアップロードする
long partSize = 128 * 1024; // Set the part size
int currentIndex = 1; // The upload part number starting from 1
File uploadFile = new File("<uploadFilePath>"); // The file to be uploaded in parts
InputStream input = new FileInputStream(uploadFile);
long fileLength = uploadFile.length();
long uploadedLength = 0;
List<PartETag> partETags = new ArrayList<PartETag>(); // Save the multipart upload result
while (uploadedLength < fileLength) {
int partLength = (int)Math.min(partSize, fileLength - uploadedLength);
byte[] partData = IOUtils.readStreamAsBytesArray(input, partLength); // Read a portion of the file according to the part size
UploadPartRequest uploadPart = new UploadPartRequest("<bucketName>", "<objectKey>", uploadId, currentIndex);
uploadPart.setPartContent(partData); // Set the part content
UploadPartResult uploadPartResult = oss.uploadPart(uploadPart);
partETags.add(new PartETag(currentIndex, uploadPartResult.getETag())); // Save the results returned after successful multipart upload
uploadedLength += partLength;
currentIndex++;
}
上記のコードを使用してUploadPartを通じて各パートをアップロードする際は、次の点に注意してください。
UploadPartメソッドでは、最後の部分を除くすべての部分が100 KBより大きい必要があります。ただし、アップロードパートのインターフェイスでは、アップロードされた部分のサイズはすぐにはチェックされません。
OSSは、サーバーが受信した部品データのMD5値をETagヘッダーに挿入してユーザーに返します。
部品番号の範囲は1〜10,000です。パート番号がこの範囲を超えると、OSSはInvalidArgumentエラーコードを返します。
各パートがアップロードされると、ストリームはパートの開始ポイントに送られます。
各部品がアップロードされた後、OSSによって返された結果には部品のETagが含まれます。 ETagと部品番号を組み合わせてpartEtagを作成し、リストに保存する必要があります。これは、マルチパートのアップロードが完了したときに使用されます。
完全なマルチパートアップロード
CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest("<bucketName>", "<objectKey>", uploadId, partETags);
CompleteMultipartUploadResult completeResult = oss.completeMultipartUpload(complete);
Log.d("multipartUpload", "multipart upload success! Location: " + completeResult.getLocation());
上記のコードでは、マルチパートアップロード中に、PartETagsがPartETagsリストに保存されています。 OSSがユーザーから提出されたPartETagsリストを受信すると、各データ部分の有効性がチェックされます。すべてのデータ部分が検証された後、OSSはこれらの部分を完全なオブジェクトに結合します。
マルチパートアップロードを完了する( “Server Callback”を設定する)
CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest("<bucketName>", "<objectKey>", uploadId, partETags);
CompleteMultipartUploadResult completeResult = oss.completeMultipartUpload(complete);
complete.setCallbackParam(new HashMap<String, String>() {
{
put("callbackUrl", "<server address>");
put("callbackBody", "<test>");
}
});
Log.d("multipartUploadWithServerCallback", completeResult.getServerCallbackReturnBody());
サーバコールバックパラメータを設定して、マルチパートアップロード要求を完了することができます。完了すると、コールバック要求が指定されたサーバーアドレスに送信されます。
マルチパートアップロードイベントを削除する
次のコードでは、abortMultipartUploadメソッドを使用してマルチパートアップロードタスクをキャンセルします。
AbortMultipartUploadRequest abort = new AbortMultipartUploadRequest("<bucketName>", "<objectKey>", uploadId);
oss.abortMultipartUpload(abort); // If no exception is thrown, it indicates the multipart upload task is successfully deleted.
部品をリストする
次のコードでは、listPartsメソッドを使用してアップロードタスクのすべてのアップロード部分を取得します。
ListPartsRequest listParts = new ListPartsRequest("<bucketName>", "<objectKey>", uploadId);
ListPartsResult result = oss.listParts(listParts);
for (int i = 0; i < result.getParts().size(); i++) {
Log.d("listParts", "partNum: " + result.getParts().get(i).getPartNumber());
Log.d("listParts", "partEtag: " + result.getParts().get(i).getETag());
Log.d("listParts", "lastModified: " + result.getParts().get(i).getLastModified());
Log.d("listParts", "partSize: " + result.getParts().get(i).getSize());
}
デフォルトでは、バケットに1,000以上のマルチパートアップロードタスクが含まれている場合、最初の1,000回のマルチパートアップロードタスクの情報のみが返され、返された結果のIsTruncatedパラメータはfalseになります。 NextPartNumberMarkerは、次の読み込みの開始点として機能するために返されます。
返されるマルチパートアップロードタスクの数を増やすには、MaxPartsパラメータを変更するか、複数のアクセスに対してPartNumberMarkerパラメータを使用します。