OSS Android SDK を使用して、バケットを作成し、オブジェクトをアップロード、ダウンロードします。
前提条件
Android SDK がインストールされていること。インストール (Android SDK) をご参照ください。
サンプルプロジェクト
サンプルプロジェクトの Config クラス内の OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET フィールドは、ローカルデバッグおよび機能検証のみを目的としています。本番環境のモバイルアプリケーションでは、長期的な AccessKey ペアをハードコードしないでください。本番環境では、以下のいずれかのアプローチを使用してください。
-
クライアント側直接転送:モバイルアプリケーションがアプリケーションサーバーから STS の一時的な認証情報を取得し、それを使用して OSSClient を初期化します。セットアップ手順については、「モバイルアプリケーション向けの直接データ転送の設定」をご参照ください。
-
サーバー生成の署名付き URL:アプリケーションサーバーが署名付き URL を生成し、それをモバイルアプリケーションに渡します。モバイルアプリケーションは、標準 HTTP 経由でアップロードまたはダウンロードを行い、認証情報を保持しません。ID カード、顔画像、決済認証情報などの機密データに推奨します。詳細については、「アクセスの承認 (Android SDK)」をご参照ください。
サンプルプロジェクトを使用するには:
-
ローカルファイルのアップロード、オブジェクトのダウンロード、再開可能なアップロード、およびコールバックの例については、サンプルディレクトリをご参照ください。
-
Git を使用してプロジェクトをクローンします。
このプロジェクトを実行する前に、Config ファイル内のパラメータを設定してください。
public class Config {
// この例では、China (Hangzhou) リージョンのエンドポイントを使用します。実際のリージョンに応じてエンドポイントを指定してください。
public static final String OSS_ENDPOINT = "https://oss-cn-hangzhou.aliyuncs.com";
// コールバック URL を指定します。
public static final String OSS_CALLBACK_URL = "https://oss-demo.aliyuncs.com:23450";
// STS 認証サーバーの URL を指定します。
// プロジェクトの sts_local_server ディレクトリ内のスクリプトに基づいて、ローカル STS 認証サーバーを起動することもできます。
public static final String STS_SERVER_URL = "http://****/sts/getsts";
public static final String BUCKET_NAME = "yourBucketName";
public static final String OSS_ACCESS_KEY_ID = "yourAccessKeyId";;
public static final String OSS_ACCESS_KEY_SECRET = "yourAccessKeySecret";
public static final int DOWNLOAD_SUC = 1;
public static final int DOWNLOAD_Fail = 2;
public static final int UPLOAD_SUC = 3;
public static final int UPLOAD_Fail = 4;
public static final int UPLOAD_PROGRESS = 5;
public static final int LIST_SUC = 6;
public static final int HEAD_SUC = 7;
public static final int RESUMABLE_SUC = 8;
public static final int SIGN_SUC = 9;
public static final int BUCKET_SUC = 10;
public static final int GET_STS_SUC = 11;
public static final int MULTIPART_SUC = 12;
public static final int STS_TOKEN_SUC = 13;
public static final int FAIL = 9999;
public static final int REQUESTCODE_AUTH = 10111;
public static final int REQUESTCODE_LOCALPHOTOS = 10112;
}
-
STS 認証サーバーの URL を設定するには、「モバイルアプリケーション直接アップロードサービスの迅速な構築」をご参照ください。
-
sts_local_server スクリプトは GitHub で入手できます。
-
AccessKey ペアを作成するには、「AccessKey ペアの作成」をご参照ください。
バケットの作成
バケットは、OSS において任意の数のオブジェクトを格納するグローバルに一意な名前空間です。
// yourEndpoint には、バケットが配置されているリージョンのエンドポイントを設定します。たとえば、バケットが China (Hangzhou) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
String endpoint = "yourEndpoint";
// region には、バケットが配置されているリージョンを設定します。たとえば、バケットが China (Hangzhou) リージョンにある場合、region を cn-hangzhou に設定します。
String region = "yourRegion";
// STS 認証サーバーから取得した一時的な AccessKey ペア (AccessKey ID および AccessKey Secret)。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// STS 認証サーバーから取得したセキュリティトークン。
String securityToken = "yourSecurityToken";
OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken);
ClientConfiguration config = new ClientConfiguration();
config.setSignVersion(SignVersion.V4);
// OSSClient インスタンスを作成します。
OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
oss.setRegion(region);
// バケット名を指定します。
CreateBucketRequest createBucketRequest = new CreateBucketRequest("bucketName");
// バケットのアクセス制御リスト (ACL) をパブリック読み取りに設定します。デフォルトの ACL はプライベートです。
createBucketRequest.setBucketACL(CannedAccessControlList.PublicRead);
// バケットが配置されるリージョンを指定します。
createBucketRequest.setLocationConstraint("oss-cn-hangzhou");
OSSAsyncTask createTask = oss.asyncCreateBucket(createBucketRequest, new OSSCompletedCallback<CreateBucketRequest, CreateBucketResult>() {
@Override
public void onSuccess(CreateBucketRequest request, CreateBucketResult result) {
Log.d("locationConstraint", request.getLocationConstraint());
}
@Override
public void onFailure(CreateBucketRequest request, ClientException clientException, ServiceException serviceException) {
// リクエストは失敗しました。
if (clientException != null) {
// クライアント例外 (ネットワークエラーなど)。
clientException.printStackTrace();
}
if (serviceException != null) {
// サービス例外。
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
オブジェクトのアップロード
ローカルファイルをオブジェクトとして OSS にアップロードします。
// yourEndpoint には、バケットが配置されているリージョンのエンドポイントを設定します。たとえば、バケットが China (Hangzhou) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
String endpoint = "yourEndpoint";
// region には、バケットが配置されているリージョンを設定します。たとえば、バケットが China (Hangzhou) リージョンにある場合、region を cn-hangzhou に設定します。
String region = "yourRegion";
// STS 認証サーバーから取得した一時的な AccessKey ペア (AccessKey ID および AccessKey Secret)。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// STS 認証サーバーから取得したセキュリティトークン。
String securityToken = "yourSecurityToken";
OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken);
ClientConfiguration config = new ClientConfiguration();
config.setSignVersion(SignVersion.V4);
// OSSClient インスタンスを作成します。
OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
oss.setRegion(region);
// アップロードリクエストを作成します。
PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectName>", "<uploadFilePath>");
// 非同期アップロードの進行状況コールバックを設定できます。
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
@Override
public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
}
});
OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
Log.d("PutObject", "UploadSuccess");
Log.d("ETag", result.getETag());
Log.d("RequestId", result.getRequestId());
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// リクエストは失敗しました。
if (clientExcepion != null) {
// クライアント例外 (ネットワークエラーなど)。
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// サービス例外。
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
// task.cancel(); // タスクをキャンセルできます。
// task.waitUntilFinished(); // アップロードが完了するまで待機します。
オブジェクトのダウンロード
OSS からオブジェクトをダウンロードし、そのデータをストリームとして読み取ります。
// yourEndpoint には、バケットが配置されているリージョンのエンドポイントを設定します。たとえば、バケットが China (Hangzhou) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
String endpoint = "yourEndpoint";
// STS 認証サーバーから取得した一時的な AccessKey ペア (AccessKey ID および AccessKey Secret)。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// STS 認証サーバーから取得したセキュリティトークン。
String securityToken = "yourSecurityToken";
// region には、バケットが配置されているリージョンを設定します。たとえば、バケットが China (Hangzhou) リージョンにある場合、region を cn-hangzhou に設定します。
String region = "yourRegion";
OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken);
ClientConfiguration config = new ClientConfiguration();
config.setSignVersion(SignVersion.V4);
// OSSClient インスタンスを作成します。
OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
oss.setRegion(region);
// ダウンロードリクエストを作成します。
GetObjectRequest get = new GetObjectRequest("<bucketName>", "<objectName>");
OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
@Override
public void onSuccess(GetObjectRequest request, GetObjectResult result) {
// リクエストは成功しました。
Log.d("asyncGetObject", "DownloadSuccess");
Log.d("Content-Length", "" + result.getContentLength());
InputStream inputStream = result.getObjectContent();
byte[] buffer = new byte[2048];
int len;
try {
while ((len = inputStream.read(buffer)) != -1) {
// ダウンロードしたデータを処理するコードをここに追加します。
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// リクエストは失敗しました。
if (clientExcepion != null) {
// クライアント例外 (ネットワークエラーなど)。
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// サービス例外。
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
// task.cancel(); // タスクをキャンセルします。
// task.waitUntilFinished(); // タスクが完了するまで待機します。