edit-icon download-icon

マルチパートアップロード

最終更新日: Oct 26, 2017

マルチパートアップロードによるファイルのアップロード方法について説明します。

マルチパートアップロードを初期化する

  1. String uploadId;
  2. InitiateMultipartUploadRequest init = new InitiateMultipartUploadRequest("<bucketName>", "<objectKey>");
  3. InitiateMultipartUploadResult initResult = oss.initMultipartUpload(init);
  4. uploadId = initResult.getUploadId();
  • InitiateMultipartUploadRequestは、アップロードするファイルの名前とバケットを指定するために使用します。

  • InitiateMultipartUploadRequestでは、ObjectMetaを設定できますが、ContentLengthを指定する必要はありません。

  • InitiateMultipartUploadによって返される結果には、マルチパートアップロードタスクを一意に識別し、後続の操作で使用されるアップロードIDを含みます。

部品をアップロードする

  1. long partSize = 128 * 1024; // Set the part size
  2. int currentIndex = 1; // The upload part number starting from 1
  3. File uploadFile = new File("<uploadFilePath>"); // The file to be uploaded in parts
  4. InputStream input = new FileInputStream(uploadFile);
  5. long fileLength = uploadFile.length();
  6. long uploadedLength = 0;
  7. List<PartETag> partETags = new ArrayList<PartETag>(); // Save the multipart upload result
  8. while (uploadedLength < fileLength) {
  9. int partLength = (int)Math.min(partSize, fileLength - uploadedLength);
  10. byte[] partData = IOUtils.readStreamAsBytesArray(input, partLength); // Read a portion of the file according to the part size
  11. UploadPartRequest uploadPart = new UploadPartRequest("<bucketName>", "<objectKey>", uploadId, currentIndex);
  12. uploadPart.setPartContent(partData); // Set the part content
  13. UploadPartResult uploadPartResult = oss.uploadPart(uploadPart);
  14. partETags.add(new PartETag(currentIndex, uploadPartResult.getETag())); // Save the results returned after successful multipart upload
  15. uploadedLength += partLength;
  16. currentIndex++;
  17. }

上記のコードを使用してUploadPartを通じて各パートをアップロードする際は、次の点に注意してください。

  • UploadPartメソッドでは、最後の部分を除くすべての部分が100 KBより大きい必要があります。ただし、アップロードパートのインターフェイスでは、アップロードされた部分のサイズはすぐにはチェックされません。

  • OSSは、サーバーが受信した部品データのMD5値をETagヘッダーに挿入してユーザーに返します。

  • 部品番号の範囲は1〜10,000です。パート番号がこの範囲を超えると、OSSはInvalidArgumentエラーコードを返します。

  • 各パートがアップロードされると、ストリームはパートの開始ポイントに送られます。

  • 各部品がアップロードされた後、OSSによって返された結果には部品のETagが含まれます。 ETagと部品番号を組み合わせてpartEtagを作成し、リストに保存する必要があります。これは、マルチパートのアップロードが完了したときに使用されます。

完全なマルチパートアップロード

  1. CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest("<bucketName>", "<objectKey>", uploadId, partETags);
  2. CompleteMultipartUploadResult completeResult = oss.completeMultipartUpload(complete);
  3. Log.d("multipartUpload", "multipart upload success! Location: " + completeResult.getLocation());

上記のコードでは、マルチパートアップロード中に、PartETagsがPartETagsリストに保存されています。 OSSがユーザーから提出されたPartETagsリストを受信すると、各データ部分の有効性がチェックされます。すべてのデータ部分が検証された後、OSSはこれらの部分を完全なオブジェクトに結合します。

マルチパートアップロードを完了する( “Server Callback”を設定する)

  1. CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest("<bucketName>", "<objectKey>", uploadId, partETags);
  2. CompleteMultipartUploadResult completeResult = oss.completeMultipartUpload(complete);
  3. complete.setCallbackParam(new HashMap<String, String>() {
  4. {
  5. put("callbackUrl", "<server address>");
  6. put("callbackBody", "<test>");
  7. }
  8. });
  9. Log.d("multipartUploadWithServerCallback", completeResult.getServerCallbackReturnBody());

サーバコールバックパラメータを設定して、マルチパートアップロード要求を完了することができます。完了すると、コールバック要求が指定されたサーバーアドレスに送信されます。

マルチパートアップロードイベントを削除する

次のコードでは、abortMultipartUploadメソッドを使用してマルチパートアップロードタスクをキャンセルします。

  1. AbortMultipartUploadRequest abort = new AbortMultipartUploadRequest("<bucketName>", "<objectKey>", uploadId);
  2. oss.abortMultipartUpload(abort); // If no exception is thrown, it indicates the multipart upload task is successfully deleted.

部品をリストする

次のコードでは、listPartsメソッドを使用してアップロードタスクのすべてのアップロード部分を取得します。

  1. ListPartsRequest listParts = new ListPartsRequest("<bucketName>", "<objectKey>", uploadId);
  2. ListPartsResult result = oss.listParts(listParts);
  3. for (int i = 0; i < result.getParts().size(); i++) {
  4. Log.d("listParts", "partNum: " + result.getParts().get(i).getPartNumber());
  5. Log.d("listParts", "partEtag: " + result.getParts().get(i).getETag());
  6. Log.d("listParts", "lastModified: " + result.getParts().get(i).getLastModified());
  7. Log.d("listParts", "partSize: " + result.getParts().get(i).getSize());
  8. }
  • デフォルトでは、バケットに1,000以上のマルチパートアップロードタスクが含まれている場合、最初の1,000回のマルチパートアップロードタスクの情報のみが返され、返された結果のIsTruncatedパラメータはfalseになります。 NextPartNumberMarkerは、次の読み込みの開始点として機能するために返されます。

  • 返されるマルチパートアップロードタスクの数を増やすには、MaxPartsパラメータを変更するか、複数のアクセスに対してPartNumberMarkerパラメータを使用します。