2012年7月26日木曜日

AWS SDK for JAVA -S3 アップロード編-

昨日に続いて、今日はAWS SDK for JAVAを用いたAmazonS3へアップロード方法を紹介。

早速サンプルソース。

public void upload() {
    //AmazonS3Clientを作成
    final BasicAWSCredentials credentials =
               new BasicAWSCredentials("アクセスキー", "シークレットキー");
    final AmazonS3Client s3Client = new AmazonS3Client(credentials);

    // アップロード対象のオブジェクトを作成
    // 第一引数:アップロード先のバケット名
    // 第二引数:アップロード後のファイル名
    // 第三引数:アップロード対象のFileオブジェクト
    final PutObjectRequest por = 
               new PutObjectRequest("バケット名", "ファイル名", new File("ファイルパス"));

    // アップロード対象ファイルの権限を設定する
    // 以下のようにすると、誰でもHTTPでファイルを参照することができるようになる
    por.setCannedAcl(CannedAccessControlList.PublicRead);

    try {
        // アップロード
        s3Client.putObject(por);
    } catch(final AmazonClientException e) {
        e.printStackTrace();
    }
}


ちなみに、PutObjectRequestのコンストラクタの第二引数のファイル名に"/"を入れると、
AWS側ではそれを、特別な扱いをしてくれることでAWS Management Consoleで見た時に、
ディレクトリであるかのように表示してくれます。
ただし、実際にはあくまで"/"がファイル名に含まれているだけの単一のファイルになっています。

AWS SDK for JAVA -S3 参照編-

Amazon Web Service(AWS)のSimple Storage Service(S3)をJavaで操作する方法。 

まず準備として、http://aws.amazon.com/jp/sdkforjava/から「AWS SDK for JAVA」をDLする。
解凍したディレクトリのlib内にある「aws-java-sdk-xxx.jar」をビルドパスに追加する。
これ、AWSをJavaから操作する場合の必須準備。

で、サンプルソース。
まずは、バケット一覧の取得。

public void dispBucketList() {

    // AWSのHP内のセキュリティ証明書から確認できる「アクセスキー」と「シークレットキー」を
    // を用いて、AWSに接続するための認証オブジェクトを作成.
    final BasicAWSCredentials credentials = 
                      new BasicAWSCredentials("アクセスキー", "シークレットキー");
 
    // S3に接続するクライアントオブジェクトを作成.
    final AmazonS3Client s3Client = new AmazonS3Client(credentials);

    // バケット情報を取得
    final List<Bucket> bucketList = s3Client.listBuckets();

    for (final Bucket bucket : bucketList) {
        System.out.println("バケット名:" + bucket.getName());
    }
}


次に、バケット内のファイル情報取得。
// 引数については、1つ目のサンプル参照
public void dispItem(final AmazonS3Client s3Client, final String bucketName) {
    // 以下のようなおまじないを書くことでエラーが出なくなるそう
    System.setProperty("org.xml.sax.driver", "org.xmlpull.v1.sax2.Driver");

    // 指定したバケット内のファイル情報を取得
    final ObjectListing objectListing = s3Client.listObjects(bucketName);
    for (final S3ObjectSummary summary : objectListing.getObjectSummaries()) {
        // ファイル名を表示
        System.out.println("ファイル名:" + summary.getKey());
    }
}

他にも色々と情報が取得できるのですが、詳しくは以下を見てみてください。
APIリファレンス