ワイヤレスネットワーク環境では、大きなオブジェクトをアップロードするのに長い時間がかかり、ネットワーク接続性の悪さやネットワークの切り替えによりアップロードが失敗することがあります。 アップロードが失敗した場合は、オブジェクト全体を再度アップロードする必要があります。 この問題に対処するために、OSS SDK for iOSは再開可能なアップロード機能を提供しています。
背景情報
モバイルデバイスからサイズが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インスタンスを作成する必要があります。 詳細については、「初期化」をご参照ください。
説明バケットのリージョンは、初期化用に指定されたエンドポイントによって決まります。
オブジェクトをアップロードするには、
oss:PutObject
権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。
例
次のコードは、チェックポイントファイルがローカルデバイスに永続的に保存されている場合に、
resumableUpload
メソッドを呼び出して再開可能なアップロードタスクを実行する方法の例を示しています。OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new]; resumableUpload.bucketName = OSS_BUCKET_PRIVATE; //... NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; resumableUpload.recordDirectoryPath = cachesDir;
説明再開可能なアップロードタスクが失敗すると、チェックポイントファイルが生成され、再開可能なアップロードの進行状況が記録されます。 次のアップロードは、チェックポイントファイルに記録された位置から、オブジェクト全体がアップロードされるまで開始されます。 オブジェクトがアップロードされると、チェックポイントファイルは自動的に削除されます。 デフォルトでは、チェックポイントファイルはローカルデバイスに永続的に保持されません。
次のコードは、再開可能なアップロードタスクを実行する方法の例を示しています。
// Obtain an upload ID to upload the object. OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new]; resumableUpload.bucketName = <bucketName>; // objectKey is equivalent to objectName that indicates the full path of the object you want to upload to OSS by using resumable upload. The path must include the extension of the object name. For example, you can set objectKey to 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]; // Specify the path to store the checkpoint file. resumableUpload.recordDirectoryPath = cachesDir; // Set the deleteUploadIdOnCancelling parameter to NO. NO indicates that the checkpoint file is not deleted when the upload task fails. The next upload starts from the position recorded in the checkpoint file until the entire object is uploaded. If you do not specify this parameter, default value YES is used. YES indicates that the checkpoint file is deleted when the upload task fails. The entire object is uploaded again during the next upload. 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) { // The task cannot be resumed. You must obtain a new upload ID to upload the object. } } else { NSLog(@"Upload file success"); } return nil; }]; // [resumeTask waitUntilFinished]; // [resumableUpload cancel];