ワイヤレスネットワーク経由で大きなファイルをアップロードするには、時間がかかる場合があります。ネットワークの状態が悪かったり、ネットワークが変更されたりすると、アップロードが失敗することがあります。アップロードが失敗した場合、ファイル全体を再アップロードする必要があります。この問題に対処するため、iOS ソフトウェア開発キット (SDK) は再開可能なアップロード機能を提供します。
背景情報
モバイルデバイスから 5 GB 未満のオブジェクトをアップロードする場合、再開可能なアップロードを使用しないことを推奨します。再開可能なアップロードは、マルチパートアップロード機能を使用して実装されます。単一オブジェクトの再開可能なアップロードには複数のネットワークリクエストが必要であり、非効率です。再開可能なアップロードを実行して 5 GB を超えるオブジェクトをアップロードする場合は、次の点にご注意ください。
再開可能なアップロード前
再開可能なアップロードを実行して OSS にオブジェクトをアップロードする前に、再開可能なアップロードの進行状況を保存するチェックポイントファイルのディレクトリを指定できます。チェックポイントファイルは、現在の再開可能なアップロードタスクにのみ適用されます。
チェックポイントファイルのディレクトリを指定しない場合、ネットワークの問題でラージオブジェクトの一部がアップロードに失敗すると、オブジェクト全体を再アップロードするために長時間を要し、大量のトラフィックが消費されます。
チェックポイントファイルのディレクトリを指定すると、失敗した再開可能なアップロードタスクは、チェックポイントファイルに記録された位置から再開できます。
再開可能なアップロード中
再開可能なアップロードでは、ローカルファイルのみをアップロードできます。再開可能なアップロードは、アップロードコールバック機能をサポートしており、これは通常のアップロードタスクと同様に使用されます。詳細については、「コールバック」をご参照ください。
再開可能なアップロードは、InitMultipartUpload、UploadPart、ListParts、CompleteMultipartUpload、AbortMultipartUpload の API 操作を呼び出すことで実行できます。Security Token Service (STS) を使用して再開可能なアップロードを実行する場合は、前述の API 操作を呼び出す権限があることを確認してください。
デフォルトでは、再開可能なアップロード中に各パートで MD5 検証が有効になっています。したがって、リクエストに
Content-Md5ヘッダーを設定する必要はありません。タスクが長期間再開できない場合、未完了のマルチパートアップロードが OSS に蓄積される可能性があります。バケットにライフサイクルルールを設定して、これらのパートを定期的に削除できます。詳細については、「ライフサイクル管理」をご参照ください。
重要再開可能なアップロードタスクをキャンセルすると、サーバーにすでにアップロードされているパートはデフォルトで削除されます。タスクをキャンセルするときにブレークポイントレコードを保持するには、レコード用のフォルダーを指定し、deleteUploadIdOnCancelling パラメーターを変更する必要があります。サーバーがレコードを長期間保持し、ライフサイクルルールによってサーバーからパートが削除された場合、サーバーとモバイルクライアントのレコードが不整合になる可能性があります。
注意事項
このトピックの例を使用する前に、カスタムドメイン名または Security Token Service (STS) を使用して OSSClient を作成する必要があります。詳細については、「初期化 (iOS SDK)」をご参照ください。
説明バケットのリージョンは、初期化構成で指定されたエンドポイントによって決まります。
ファイルをアップロードするには、
oss:PutObject権限が必要です。詳細については、「RAM ユーザーへのカスタムアクセスポリシーの付与」をご参照ください。
サンプルコード
ブレークポイントレコードをローカルに保存するには、
resumableUploadメソッドを呼び出して、次のように再開可能なアップロードを実行します。OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new]; resumableUpload.bucketName = OSS_BUCKET_PRIVATE; //... NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; resumableUpload.recordDirectoryPath = cachesDir;説明再開可能なアップロードが失敗すると、ブレークポイントレコードファイルが作成されます。その後、アップロードは完了するまでブレークポイントから再開されます。アップロードが成功すると、ブレークポイントレコードファイルは自動的に削除されます。デフォルトでは、ブレークポイントレコードはローカルに保存されません。
次のコードは、再開可能なアップロードの完全な例です。
// ファイルをアップロードするための UploadId を取得します。 OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new]; resumableUpload.bucketName = <bucketName>; // objectKey は objectName と同じです。OSS にアップロードしたいオブジェクトの完全なパス (ファイル拡張子を含む) を指定します。例:abc/efg/123.jpg。 resumableUpload.objectKey = <objectKey>; resumableUpload.partSize = 1024 * 1024; resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend); }; NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; // ブレークポイントレコードを保存するパスを設定します。 resumableUpload.recordDirectoryPath = cachesDir; // deleteUploadIdOnCancelling パラメーターを NO に設定します。これは、ブレークポイントレコードファイルが削除されないことを示します。アップロードが失敗した場合、ファイルが完全にアップロードされるまでブレークポイントから再開されます。このパラメーターを設定しない場合、デフォルト値の YES が使用されます。これは、ブレークポイントレコードファイルが削除されることを示します。次回同じファイルをアップロードするときは、最初からアップロードが開始されます。 resumableUpload.deleteUploadIdOnCancelling = NO; resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>]; OSSTask * resumeTask = [client resumableUpload:resumableUpload]; [resumeTask continueWithBlock:^id(OSSTask *task) { if (task.error) { NSLog(@"error: %@", task.error); if ([task.error.domain isEqualToString:OSSClientErrorDomain] && task.error.code == OSSClientErrorCodeCannotResumeUpload) { // このタスクは再開できません。新しい uploadId を取得してファイルを再アップロードする必要があります。 } } else { NSLog(@"Upload file success"); } return nil; }]; // [resumeTask waitUntilFinished]; // [resumableUpload cancel];