edit-icon download-icon

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

最終更新日: Nov 02, 2017

このドキュメントでは、マルチパートアップロードを使用してオブジェクトをアップロードする方法について説明します。

マルチパートアップロードの初期化

  1. __block NSString * uploadId = nil;
  2. __block NSMutableArray * partInfos = [NSMutableArray new];
  3. NSString * uploadToBucket = @"<bucketName>";
  4. NSString * uploadObjectkey = @"<objectKey>";
  5. OSSInitMultipartUploadRequest * init = [OSSInitMultipartUploadRequest new];
  6. init.bucketName = uploadToBucket;
  7. init.objectKey = uploadObjectkey;
  8. // init.contentType = @"application/octet-stream";
  9. OSSTask * initTask = [client multipartUploadInit:init];
  10. [initTask waitUntilFinished];
  11. if (!initTask.error) {
  12. OSSInitMultipartUploadResult * result = initTask.result;
  13. uploadId = result.uploadId;
  14. } else {
  15. NSLog(@"multipart upload failed, error: %@", initTask.error);
  16. return;
  17. }
  • OSSInitMultipartUploadRequestをアップロードすると、オブジェクトの名前を指定するバケットのオブジェクトが格納されています。

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

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

  1. NSString * filePath = [docDir stringByAppendingPathComponent:@"***"];
  2. //アップロードのファイル名
  3. int chuckCount = *;
  4. //マルチパートの数
  5. uint64_t offset = fileSie/chuckCount;
  6. //マルチパートのサイズ
  7. for (int i = 1; i <= chuckCount; i++) {
  8. OSSUploadPartRequest * uploadPart = [OSSUploadPartRequest new];
  9. uploadPart.bucketName = uploadToBucket;
  10. uploadPart.objectkey = uploadObjectkey;
  11. uploadPart.uploadId = uploadId;
  12. uploadPart.partNumber = i; // パートナンバーは 1 から
  13. NSFileHandle* readHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
  14. [readHandle seekToFileOffset:offset * (i -1)];
  15. NSData* data = [readHandle readDataOfLength:offset];
  16. uploadPart.uploadPartData = data;
  17. OSSTask * uploadPartTask = [client uploadPart:uploadPart];
  18. [uploadPartTask waitUntilFinished];
  19. if (!uploadPartTask.error) {
  20. OSSUploadPartResult * result = uploadPartTask.result;
  21. uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:uploadPart.uploadPartFileURL.absoluteString error:nil] fileSize];
  22. [partInfos addObject:[OSSPartInfo partInfoWithPartNum:i eTag:result.eTag size:fileSize]];
  23. } else {
  24. NSLog(@"upload part error: %@", uploadPartTask.error);
  25. return;
  26. }
  27. }

上記のコードを使用して各パートをuploadPartでアップロードする場合は、次の点を考慮してください。

  • 複数のアップロード要求ごとにUploadIDとPartNumを指定する必要があります。

  • uploadPartメソッドでは、最後の部分を除くすべての部分が100 KBより大きい必要があります。ただし、uploadPartインターフェイスでは、アップロードされたパーツのサイズは、そのパーツが最後のパーツであるかどうかを判断できないため、すぐに確認されません。マルチパートアップロードが完了したときにのみサイズをチェックします。

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

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

  • 各パーツがアップロードされると、返されたOSSの結果には、アップロードされたパーツのMD5値と同じ値の部分ETagが含まれます。Partagagを作成するには、ETagとPartNumを組み合わせる必要があります。これは、複数パートのアップロードが完了したときに使用されます。

マルチパートアップロードの完了

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

  1. OSSCompleteMultipartUploadRequest * complete = [OSSCompleteMultipartUploadRequest new];
  2. complete.bucketName = uploadToBucket;
  3. complete.objectKey = uploadObjectkey;
  4. complete.uploadId = uploadId;
  5. complete.partInfos = partInfos;
  6. OSSTask * completeTask = [client completeMultipartUpload:complete];
  7. [[completeTask continueWithBlock:^id(OSSTask *task) {
  8. if (!task.error) {
  9. OSSCompleteMultipartUploadResult * result = task.result;
  10. // ...
  11. } else {
  12. // ...
  13. }
  14. return nil;
  15. }] waitUntilFinished];

マルチパートアップロードの完了(Server Callback 設定)

マルチパートアップロード完了後、Server Callback パラメータを設定することができます。アップロードが完了すると、Callback リクエストが指定されたサーバーアドレスに送信されます。返された結果の result.serverReturnJsonString は、Server Callback の結果を示します。

  1. OSSCompleteMultipartUploadRequest * complete = [OSSCompleteMultipartUploadRequest new];
  2. complete.bucketName = @"<bucketName>";
  3. complete.objectKey = @"<objectKey>";
  4. complete.uploadId = uploadId;
  5. complete.partInfos = partInfos;
  6. complete.callbackParam = @{
  7. @"callbackUrl": @"<server address>",
  8. @"callbackBody": @"<test>"
  9. };
  10. complete.callbackVar = @{
  11. @"var1": @"value1",
  12. @"var2": @"value2"
  13. };
  14. OSSTask * completeTask = [client completeMultipartUpload:complete];
  15. [[completeTask continueWithBlock:^id(OSSTask *task) {
  16. if (!task.error) {
  17. OSSCompleteMultipartUploadResult * result = task.result;
  18. NSLog(@"server call back return : %@", result.serverReturnJsonString);
  19. } else {
  20. // ...
  21. }
  22. return nil;
  23. }] waitUntilFinished];

マルチパートアップロードの削除

次のコードは、該当 UploadId のマルチパートアップロードを削除します。

  1. OSSAbortMultipartUploadRequest * abort = [OSSAbortMultipartUploadRequest new];
  2. abort.bucketName = @"<bucketName>";
  3. abort.objectKey = @"<objectKey>";
  4. abort.uploadId = uploadId;
  5. OSSTask * abortTask = [client abortMultipartUpload:abort];
  6. [abortTask waitUntilFinished];
  7. if (!abortTask.error) {
  8. OSSAbortMultipartUploadResult * result = abortTask.result;
  9. uploadId = result.uploadId;
  10. } else {
  11. NSLog(@"multipart upload failed, error: %@", abortTask.error);
  12. return;
  13. }

マルチパートアップロードのリストパッツ

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

  1. OSSListPartsRequest * listParts = [OSSListPartsRequest new];
  2. listParts.bucketName = @"<bucketName>";
  3. listParts.objectKey = @"<objectkey>";
  4. listParts.uploadId = @"<uploadid>";
  5. OSSTask * listPartTask = [client listParts:listParts];
  6. [listPartTask continueWithBlock:^id(OSSTask *task) {
  7. if (!task.error) {
  8. NSLog(@"list part result success!");
  9. OSSListPartsResult * listPartResult = task.result;
  10. for (NSDictionary * partInfo in listPartResult.parts) {
  11. NSLog(@"each part: %@", partInfo);
  12. }
  13. } else {
  14. NSLog(@"list part result error: %@", task.error);
  15. }
  16. return nil;
  17. }];

注:デフォルトでは、バケットに 1,000 以上のマルチパートアップロードタスクが含まれている場合、最初の1,000 回のマルチパートアップロードタスクの情報のみが返され、返された結果の IsTruncated パラメータは false になります。さらに、NextPartNumberMarker は次の読み込みの開始点として返されます。