すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:再開可能なアップロード

最終更新日:Dec 19, 2023

ワイヤレスネットワーク環境では、大きなオブジェクトをアップロードするのに長い時間がかかり、ネットワーク接続性の悪さやネットワークの切り替えによりアップロードが失敗することがあります。 アップロードが失敗した場合は、オブジェクト全体を再度アップロードする必要があります。 この問題に対処するために、OSS SDK for iOSは再開可能なアップロード機能を提供しています。

背景情報

モバイルデバイスからサイズが5 GB未満のオブジェクトをアップロードする場合は、再開可能なアップロードを使用しないことを推奨します。 再開可能なアップロードは、マルチパートアップロード方式を使用して実装されます。 単一のオブジェクトの再開可能なアップロードは、複数のネットワーク要求を必要とし、非効率的である。 再開可能なアップロードを使用してサイズが5 GBを超えるオブジェクトをアップロードする場合は、次の項目に注意してください。

  • 再開可能アップロード前

    再開可能アップロードメソッドを使用してオブジェクトをOSSにアップロードする前に、再開可能アップロードレコードを格納するチェックポイントファイルのディレクトリを指定できます。 チェックポイントファイルは、現在の再開可能なアップロードタスクにのみ適用されます。

    • チェックポイントファイルのディレクトリを指定しない場合、ネットワークの問題によりラージオブジェクトの一部のアップロードに失敗すると、ラージオブジェクト全体を再度アップロードするのに時間がかかり、大量のトラフィックが消費されます。
    • チェックポイントファイルのディレクトリを指定すると、チェックポイントファイルに記録された位置から、失敗した再開可能なアップロードタスクを再開できます。
  • 再開可能アップロード中
    • 再開可能なアップロードでは、ローカルファイルのみをアップロードできます。 再開可能なアップロードは、アップロードコールバックをサポートします。 再開可能アップロードは、アップロードコールバックと同様の方法で使用できます。 詳細については、「コールバック」をご参照ください。
    • 再開可能なアップロードは、InitMultipartUploadUploadPartListPartsCompleteMultipartUpload、およびAbortMultipartUploadのAPIを呼び出すことによって実装されます。 Security Token Service (STS) 認証モードを使用して再開可能なアップロードタスクを実行する場合は、上記のAPI操作を呼び出す権限があることを確認してください。
    • デフォルトでは、再開可能なアップロードタスクで各パーツのMD5ハッシュが検証されます。 したがって、リクエストにContent-Md5ヘッダーを指定する必要はありません。
    • 再開可能なアップロードタスクが失敗し、長期間再開されない場合、アップロードされたパーツがOSSで役に立たなくなる可能性があります。 バケットのライフサイクルルールを設定して、期限切れのパーツを削除できます。 詳細は、「ライフサイクルルールの管理」をご参照ください。
      重要 デフォルトでは、現在のアップロードタスクがキャンセルされた場合、サーバーにアップロードされたパーツは同期的に削除されます。 再開可能なアップロードレコードを保持する場合は、再開可能なアップロードレコードを含むチェックポイントファイルを格納するフォルダを指定し、deleteUploadIdOnCancellingパラメーターの設定を変更する必要があります。 再開可能なアップロードレコードがモバイルデバイスに長期間保持されているが、サーバーにアップロードされたパーツがバケットの設定されたライフサイクルルールによって削除されている場合、サーバーの再開可能なアップロードレコードはモバイルデバイスのものとは異なる可能性があります。

  • 次のコードは、チェックポイントファイルがローカルデバイスに永続的に保存されている場合に、resumableUploadメソッドを呼び出して再開可能なアップロードタスクを実行する方法の例を示しています。
    
    resumableUpload.bucketName = OSS_BUCKET_PRIVATE;
    //...
    NSString * cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    resumableUpload.recordDirectoryPath = cachesDir;
                        
    説明 再開可能なアップロードタスクが失敗すると、チェックポイントファイルが生成され、再開可能なアップロードの進行状況が記録されます。 次のアップロードは、チェックポイントファイルに記録された位置から開始し、オブジェクト全体をアップロードします。 オブジェクトがアップロードされると、チェックポイントファイルは自動的に削除されます。 デフォルトでは、チェックポイントファイルはローカルデバイスに永続的に保持されません。
  • 次のコードでは、再開可能なアップロードタスクを実行する方法の例を示します
    。// オブジェクトをアップロードするためのアップロードIDを取得します。 
    OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];
    resumableUpload.bucketName = <bucketName>;
    // objectKeyは、再開可能アップロードを使用してOSSにアップロードするオブジェクトのフルパスを示すobjectNameと同等です。 パスには、オブジェクト名の拡張子を含める必要があります。 たとえば、objectKeyを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に設定します。 NOは、アップロードタスクが失敗してもチェックポイントファイルが削除されないことを示します。 次のアップロードは、チェックポイントファイルに記録された位置から開始し、オブジェクト全体をアップロードします。 このパラメーターを指定しない場合、デフォルト値はYESになります。 YESは、アップロードタスクが失敗したときにチェックポイントファイルが削除されることを示します。 次のアップロード時にオブジェクト全体が再アップロードされます。 
    resumableUpload.de leteUploadIdOnCancelling = NO;
    
    resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<ファイルパス>];
    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) {
                // タスクを再開できません。 オブジェクトをアップロードするには、新しいアップロードIDを取得する必要があります。 
            }
        } else {
            NSLog(@ "ファイルのアップロード成功");
        }
        nilを返します。}];
    
    // [resumeTask waitUntilFinished];
    
    // [resumableUploadキャンセル];