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

Object Storage Service:OSS SDK for Androidを使用して再開可能なアップロードを実行する

最終更新日:Mar 11, 2024

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

概要

OSS SDK for Androidは、再開可能なアップロードを実行するための次のメソッドを提供します: resumableUploadとsequenceUpload。

  • (推奨) resumableUploadは、複数のパーツを並行してアップロードすることを指定します。 最大5つのパーツを並行してアップロードできます。

  • sequenceUploadは、パーツを順次アップロードすることを指定します。 次のパートは、前のパートがアップロードされた後にアップロードされます。

このトピックでは、次のサンプルコードでは、resumableUploadメソッドを使用して再開可能アップロードを実行する方法の例のみを示します。 再開可能アップロードを実行して複数のオブジェクトをアップロードする場合は、複数の再開アップロード要求を作成する必要があります。

使用上の注意

このトピックのサンプルコードを実行する前に、カスタムドメイン名やSecurity Token Service (STS) などの方法を使用してOSSClientインスタンスを作成する必要があります。 詳細については、「初期化」をご参照ください。

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

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

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

    • チェックポイントファイルのディレクトリを指定しない場合、ネットワークの問題により大きなオブジェクトの一部のアップロードに失敗すると、長い時間が必要になり、オブジェクト全体を再アップロードするために大量のトラフィックが消費されます。

    • チェックポイントファイルのディレクトリを指定すると、チェックポイントファイルに記録された位置から、失敗した再開可能なアップロードタスクを再開できます。

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

    • 再開可能なアップロードでは、ローカルファイルのみをアップロードできます。 再開可能なアップロードは、一般的なアップロードタスクと同じ方法で使用されるアップロードコールバック機能をサポートしています。 詳細については、「コールバック」をご参照ください。

    • 再開可能なアップロードを実行するには、InitMultipartUploadUploadPartListPartsCompleteMultipartUpload、およびAbortMultipartUpload APIを呼び出します。 Security Token Service (STS) を使用して再開可能なアップロードを実行する場合は、上記のAPI操作を呼び出す権限があることを確認してください。

    • デフォルトでは、再開可能なアップロードタスクで各パーツのMD5ハッシュが検証されます。 したがって、リクエストにContent-Md5ヘッダーを指定する必要はありません。

    • 再開可能なアップロードタスクが失敗して完了しない場合、アップロードされたパーツはOSSで不要になります。 この問題を解決するには、部品が格納されているバケットのライフサイクルルールを設定して、定期的に部品を削除します。 詳細については、「ライフサイクルルールの設定」をご参照ください。

再開可能なアップロードを実行することで、ローカルファイルをOSSに同期または非同期でアップロードできます。

再開可能アップロードによるローカルファイルの同期アップロード

次のサンプルコードでは、examplefile.txtという名前のローカルファイルをexamplebucketバケットのexampledirディレクトリに同期アップロードする方法の例を示します。 ローカルファイルがアップロードされると、オブジェクトの名前はexampleobject.txtになります。 チェックポイントファイルはコンピュータに保存されます。

// バケットの名前を指定します。 例: examplebucket. 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
文字列objectName = "exampledir/exampleobject.txt";
// ローカルファイルのフルパスを指定します。 例: /storage/emulated/0/oss/examplefile.txt 
文字列localFilepath = "/storage/emulated/0/oss/examplefile.txt";

String recordDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/oss_record/";

ファイルrecordDir=新しいファイル (recordDirectory);

// チェックポイントファイルを格納するディレクトリが存在することを確認してください。 ディレクトリが存在しない場合は、ディレクトリを作成します。 
if (!recordDir.exists()) {
    recordDir.mkdirs();
}

// 再開可能なアップロードリクエストを作成し、チェックポイントファイルの絶対パスを指定します。 
ResumableUploadRequest request = new ResumableUploadRequest(bucketName、objectName、localFilepath、recordDirectory);
// OSSAsyncTask cancel() メソッドを使用する場合は、DeleteUploadOnCancellingパラメーターをfalseに設定します。 falseは、チェックポイントファイルが保持されていることを示します。 オブジェクトは、次のアップロード時にチェックポイントファイルに記録された位置からアップロードされます。 このパラメーターを指定しない場合、デフォルト値trueが使用されます。 trueは、チェックポイントファイルが削除されたことを示します。 次のアップロード時にオブジェクト全体が再アップロードされます。 
request.setDeleteUploadOnCancelling(false);
// アップロードコールバックを設定します。 
request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() {
    @オーバーライド
    public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) {
        Log.d("resumableUpload" 、"currentSize: " + currentSize + "totalSize: " + totalSize);
    }
});


ResumableUploadResult uploadResult = oss.resumableUpload (リクエスト); 

次のサンプルコードは、ファイルのURIを使用して、ファイルをOSSにアップロードし、Android 10以降のスコープストレージに使用する方法の例を示しています。

// バケットの名前を指定します。 例: examplebucket. 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
文字列objectName = "exampledir/exampleobject.txt";

String recordDirectory = getApplication().getFilesDir().getAbsolutePath() + "/oss_record/";

ファイルrecordDir=新しいファイル (recordDirectory);

// チェックポイントファイルを格納するディレクトリが存在することを確認してください。 ディレクトリが存在しない場合は、ディレクトリを作成します。 
if (!recordDir.exists()) {
    recordDir.mkdirs();
}

// 再開可能なアップロードリクエストを作成し、チェックポイントファイルの絶対パスを指定します。 
// fileUriパラメーターをファイルの実際のURIに設定します。 
ResumableUploadRequest request = new ResumableUploadRequest(bucketName、objectName、fileUri、recordDirectory);
// OSSAsyncTask cancel() メソッドを使用する場合は、DeleteUploadOnCancellingパラメーターをfalseに設定します。 falseは、チェックポイントファイルが保持されていることを示します。 オブジェクトは、次のアップロード時にチェックポイントファイルに記録された位置からアップロードされます。 このパラメーターを指定しない場合、デフォルト値trueが使用されます。 trueは、チェックポイントファイルが削除されたことを示します。 次のアップロード時にオブジェクト全体が再アップロードされます。 
request.setDeleteUploadOnCancelling(false);
// アップロードコールバックを設定します。 
request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() {
    @オーバーライド
    public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) {
        Log.d("resumableUpload" 、"currentSize: " + currentSize + "totalSize: " + totalSize);
    }
});


ResumableUploadResult uploadResult = oss.resumableUpload (リクエスト); 

次のサンプルコードは、チェックポイントファイルをコンピューターに保存せずに再開可能なアップロードを実行する方法の例を示しています。

// バケットの名前を指定します。 例: examplebucket. 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
文字列objectName = "exampledir/exampleobject.txt";
// ローカルファイルのフルパスを指定します。 例: /storage/emulated/0/oss/examplefile.txt 
文字列localFilepath = "/storage/emulated/0/oss/examplefile.txt";

// 再開可能なアップロード要求を作成します。 
ResumableUploadRequest request = new ResumableUploadRequest(bucketName, objectName, localFilepath);
// アップロードコールバックを設定します。 
request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() {
    @オーバーライド
    public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) {
        Log.d("resumableUpload" 、"currentSize: " + currentSize + "totalSize: " + totalSize);
    }
});


ResumableUploadResult uploadResult = oss.resumableUpload (リクエスト); 

再開可能アップロードによるローカルファイルの非同期アップロード

次のサンプルコードは、examplefile.txtという名前のローカルファイルをexamplebucketバケットのexampledirディレクトリに非同期でアップロードする方法の例を示しています。 ローカルファイルがアップロードされると、オブジェクトの名前はexampleobject.txtになります。 チェックポイントファイルはコンピュータに保存されます。

// バケットの名前を指定します。 例: examplebucket. 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
文字列objectName = "exampledir/exampleobject.txt";
// ローカルファイルのフルパスを指定します。 例: /storage/emulated/0/oss/examplefile.txt 
文字列localFilepath = "/storage/emulated/0/oss/examplefile.txt";
String recordDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/oss_record/";

ファイルrecordDir=新しいファイル (recordDirectory);

// チェックポイントファイルを格納するディレクトリが存在することを確認してください。 ディレクトリが存在しない場合は、ディレクトリを作成します。 
if (!recordDir.exists()) {
    recordDir.mkdirs();
}

// 再開可能なアップロードリクエストを作成し、チェックポイントファイルの絶対パスを指定します。 
ResumableUploadRequest request = new ResumableUploadRequest(bucketName、objectName、localFilepath、recordDirectory);
// OSSAsyncTask cancel() メソッドを使用する場合は、DeleteUploadOnCancellingパラメーターをfalseに設定します。 falseは、チェックポイントファイルが保持されていることを示します。 オブジェクトは、次のアップロード時にチェックポイントファイルに記録された位置からアップロードされます。 このパラメーターを指定しない場合、デフォルト値trueが使用されます。 trueは、チェックポイントファイルが削除されたことを示します。 次のアップロード時にオブジェクト全体が再アップロードされます。 
request.setDeleteUploadOnCancelling(false);
// アップロードコールバックを設定します。 
request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() {
    @オーバーライド
    public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) {
        Log.d("resumableUpload" 、"currentSize: " + currentSize + "totalSize: " + totalSize);
    }
});


OSSAsyncTask resumableTask = oss.asyncResumableUpload(request, new OSSCompletedCallback<ResumableUploadRequest, ResumableUploadResult>() {
    @オーバーライド
    public void onSuccess(ResumableUploadRequestリクエスト, ResumableUploadResult結果) {
        Log.d("resumableUpload" 、"success!");
    }

    @オーバーライド
    public void onFailure(ResumableUploadRequest request, ClientException clientExcepion, ServiceException serviceException) {
        // Handle exceptions. 
    }
});

// 再開可能なアップロードタスクが完了するまで待ちます。 
resumableTask.waitUntilFinished(); 

次のサンプルコードは、ファイルのURIを使用して、ファイルをOSSにアップロードし、Android 10以降のスコープストレージに使用する方法の例を示しています。

// バケットの名前を指定します。 例: examplebucket. 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
文字列objectName = "exampledir/exampleobject.txt";
String recordDirectory = getApplication().getFilesDir().getAbsolutePath() + "/oss_record/";

ファイルrecordDir=新しいファイル (recordDirectory);

// チェックポイントファイルを格納するディレクトリが存在することを確認してください。 ディレクトリが存在しない場合は、ディレクトリを作成します。 
if (!recordDir.exists()) {
    recordDir.mkdirs();
}

// 再開可能なアップロードリクエストを作成し、チェックポイントファイルの絶対パスを指定します。 
// fileUriパラメーターをファイルの実際のURIに設定します。 
ResumableUploadRequest request = new ResumableUploadRequest(bucketName、objectName、fileUri、recordDirectory);
// OSSAsyncTask cancel() メソッドを使用する場合は、DeleteUploadOnCancellingパラメーターをfalseに設定します。 falseは、チェックポイントファイルが保持されていることを示します。 オブジェクトは、次のアップロード時にチェックポイントファイルに記録された位置からアップロードされます。 このパラメーターを指定しない場合、デフォルト値trueが使用されます。 trueは、チェックポイントファイルが削除されたことを示します。 次のアップロード時にオブジェクト全体が再アップロードされます。 
request.setDeleteUploadOnCancelling(false);
// アップロードコールバックを設定します。 
request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() {
    @オーバーライド
    public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) {
        Log.d("resumableUpload" 、"currentSize: " + currentSize + "totalSize: " + totalSize);
    }
});


OSSAsyncTask resumableTask = oss.asyncResumableUpload(request, new OSSCompletedCallback<ResumableUploadRequest, ResumableUploadResult>() {
    @オーバーライド
    public void onSuccess(ResumableUploadRequestリクエスト, ResumableUploadResult結果) {
        Log.d("resumableUpload" 、"success!");
    }

    @オーバーライド
    public void onFailure(ResumableUploadRequest request, ClientException clientExcepion, ServiceException serviceException) {
        // Handle exceptions. 
    }
});

// 再開可能なアップロードタスクが完了するまで待ちます。 
resumableTask.waitUntilFinished(); 

次のサンプルコードは、チェックポイントファイルをコンピューターに保存せずに再開可能なアップロードを実行する方法の例を示しています。

// バケットの名前を指定します。 例: examplebucket. 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
文字列objectName = "exampledir/exampleobject.txt";
// ローカルファイルのフルパスを指定します。 例: /storage/emulated/0/oss/examplefile.txt 
文字列localFilepath = "/storage/emulated/0/oss/examplefile.txt";

// 再開可能なアップロード要求を作成します。 
ResumableUploadRequest request = new ResumableUploadRequest(bucketName, objectName, localFilepath);

// アップロードコールバックを設定します。 
request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() {
    @オーバーライド
    public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) {
        Log.d("resumableUpload" 、"currentSize: " + currentSize + "totalSize: " + totalSize);
    }
});
// asyncResumableUploadメソッドを呼び出して、再開可能なアップロードタスクを実行します。 
OSSAsyncTask resumableTask = oss.asyncResumableUpload(request, new OSSCompletedCallback<ResumableUploadRequest, ResumableUploadResult>() {
    @オーバーライド
    public void onSuccess(ResumableUploadRequestリクエスト, ResumableUploadResult結果) {
        Log.d("resumableUpload" 、"success!");
    }

    @オーバーライド
    public void onFailure(ResumableUploadRequest request, ClientException clientExcepion, ServiceException serviceException) {
        // Handle exceptions. 
    }
});

// 再開可能なアップロードタスクが完了するまで待ちます。 
resumableTask.waitUntilFinished(); 

参考資料

  • バケットのライフサイクルルールを設定する方法の詳細については、「ライフサイクルルールの設定」をご参照ください。

  • 再開可能アップロードにアップロードコールバックを実装する方法の詳細については、「コールバック」をご参照ください。

  • OSSClientインスタンスを初期化する方法の詳細については、「初期化」をご参照ください。