AWS S3 iOS オブジェクトのダウンロード

公開: 2014-08-19 05:20
更新: 2016-04-29 06:02

前回はAWS SDK for iOS のバージョン2でオブジェクトのリストを取得しました。
⇒ AWS S3 iOS オブジェクトリストを取得する

今回はキーを指定してオブジェクトをダウンロードします。



まずはAWS SDKを
こちらからダウンロードするか
⇒ https://github.com/aws/aws-sdk-ios-v2


CocoaPodsにも対応しているので、
次のようにPodfileに入力してインストールしましょう。

pod 'AWSiOSSDKv2'

ちなみにバージョンは2.0.7を使用しているので
なんか差異があってどうのこうのな場合は

pod 'AWSiOSSDKv2', '2.0.7'

と指定してやってください。



キーを指定してダウンロード出来るような関数を用意します。
#import "MYClass.h"
#import "S3.h"

@implementation MYClass

NSString * const AWS_KEY = @"YOURAWSKEY";
NSString * const AWS_SECRET = @"YOURAWSSECRET";
NSString * const S3_BUCKET = @"your-bucket";

-(void)downloadS3ObjectWithKey:(NSString*)key update:(void (^)(int64_t, int64_t, int64_t))update finished:(void (^)(AWSS3TransferManagerDownloadOutput *))finished
{
        //AWSのリージョン 東京の場合はこれ
        AWSRegionType region = AWSRegionAPNortheast1;
        
        //ダウンロードしてくれそうな奴を用意
        AWSStaticCredentialsProvider *provider = [AWSStaticCredentialsProvider credentialsWithAccessKey:AWS_KEY secretKey:AWS_SECRET];
        AWSServiceConfiguration *config = [AWSServiceConfiguration configurationWithRegion:region credentialsProvider:provider];
        AWSS3TransferManager *s3Manager = [[AWSS3TransferManager alloc] initWithConfiguration:config identifier:@"hoge"]; //identifierはManagerのキャッシュで使う
        //self.s3Manager = s3Manager; //途中でポーズとかキャンセルとかするならプロパティに持つとよさげ。

        //ファイルの保存先(というかダウンロード中に使用するPathだけど)
        NSString *savePath = [NSTemporaryDirectory() stringByAppendingPathComponent:key];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        [fileManager createDirectoryAtPath:savePath withIntermediateDirectories:YES attributes:nil error:nil];
        
        //保存先にすでになんかファイルがある場合は削除
        NSURL *saveURL = [NSURL fileURLWithPath:savePath];
        if([fileManager fileExistsAtPath:savePath]) {
                [fileManager removeItemAtURL:saveURL error:nil];
        }

        //リクエスト作成
        AWSS3TransferManagerDownloadRequest *downloadRequest = [[AWSS3TransferManagerDownloadRequest alloc] init];
        downloadRequest.bucket = S3_BUCKET;
        downloadRequest.key = key;
        downloadRequest.downloadingFileURL = saveURL;
        [downloadRequest setDownloadProgress:^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite){
                update(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
        }];
        //self.downloadRequest = downloadRequest; //途中でキャンセルとか入れたかったらプロパティに持つとよさげ。
        
        //ダウンロード開始!
        [[s3Manager download:downloadRequest] continueWithBlock:^id(BFTask *task) {
                if (task.isCancelled) {
                        //キャンセルが呼ばれたとき
                } else if (task.error) {
                        //エラーが発生したとき
                } else {
                        //取得成功
                        AWSS3TransferManagerDownloadOutput *result = task.result;
                        finished(result);
                }
                return nil;
        }];
}

AWS_KEYとAWS_SECRET、
S3_BUCKETに自分の環境のものを入れてくださいまし。



それでは試しにimage/apple.jpgってなキーのオブジェクトをダウンロードしてみます。

-(void)fuga
{
        MYClass *m = [[MYClass alloc] init];
        NSString *key = @"image/apple.jpg";
        [m downloadS3ObjectWithKey:key update:^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
                NSLog(@"ダウンロード中 %lld/%lld byte", totalBytesWritten, totalBytesExpectedToWrite);
        } finished:^(AWSS3TransferManagerDownloadOutput *result) {
                NSURL *fileURL = result.body;
                NSLog(@"ダウンロード完了\n保存先:%@", fileURL);
        }];
}
結果
ダウンロード中 34466/733752 bytes
ダウンロード中 156322/733752 bytes
ダウンロード中 295586/733752 bytes
ダウンロード中 415394/733752 bytes
ダウンロード中 546466/733752 bytes
ダウンロード中 677538/733752 bytes
ダウンロード中 733752/733752 bytes
ダウンロード完了
保存先:file:///var/mobile/Applications/018EDC37-8BDC-4F0F-2A39-D058D937978B/tmp/image/apple.jpg

OKです。
ダウンロード状況もほほいと扱えるので便利です。
保存したファイルはfileURLにあるので後は表示するなりコピーするなりしてください。

ではでは。



この記事をシェア
この記事にコメントする
書き込む
あっきぃ(@appstars_aki)
Web、iOSなフリーランサーです。好きなものはお寿司です。でもお寿司は高いので普段は雑草とか拾ったドングリを食べています。お仕事や意味もなく毎月お小遣いをくれる人を探してます。

お仕事の依頼や自分で作ったアプリのレビューを希望しちゃう方はaki@appstars.jpまでご連絡ください。