どうも、フリーランスのITエンジニア兼ブロガー兼投資家のKerubitoです。
Swiftを使ってS3からファイルをダウンロードしたい。
よくあることだと思います。
しかし、ググってもなかなかわかりやすい答えが見つからないので、最速・簡単に「Swiftを使ってS3からファイルをダウンロード」する方法を載せておきます。
では、ぱぱっとやってみましょう。
環境は以下の通りです。
・Swiftバージョン:5
・Xcodeバージョン:12.2
・使用デバイス:iPhone8(14.2)
事前にいろいろ準備が必要
前提として、S3の該当するプレフィックスにアクセス許可を与えておく必要があります。
サーバ開発者に依頼しましょう。
自分でサーバ開発もやっている場合は、自分で権限を付与しましょう。
それにSwift用のS3ライブラリも入れておく必要があります。
あとでちょっと触れますが、Cognito認証をやっておきましょう。
S3からダウンロード
以下がS3から任意のファイルをダウンロードするコードの本体。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class S3Util { internal static func download(key: String, url: URL) { let completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock = { (task, location, data, error) -> Void in DispatchQueue.main.async(execute: { if let error = error { print("\(error)") } else { // 正常 } }) } let bucket = "bucket" let expression = AWSS3TransferUtilityDownloadExpression() AWSS3TransferUtility.default().download(to: url, bucket: bucket, key: key, expression: expression, completionHandler: completionHandler).continueWith { (task) -> Void in if let error = task.error { print("\(error)") } } } } |
少し解説しておくと、後半部分がダウンロードの処理です。
1 2 3 4 5 6 7 | let bucket = "bucket" let expression = AWSS3TransferUtilityDownloadExpression() AWSS3TransferUtility.default().download(to: url, bucket: bucket, key: key, expression: expression, completionHandler: completionHandler).continueWith { (task) -> Void in if let error = task.error { print("\(error)") } } |
ここで注意点としては、事前にCognitoによる認証をしている必要があります。
ここでやってもいいのですが、通常はログインなどでやっておくことになるかと。
bucketはそれぞれの環境に合わせたものを指定してください。
keyはS3のプレフィックスを指定します。
urlはデバイス側の保存したい場所を指定します。
ここが間違いやすいので、注意してください。
そして、前半部分が完了のコールバックですね。
1 2 3 4 5 6 7 8 9 | let completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock = { (task, location, data, error) -> Void in DispatchQueue.main.async(execute: { if let error = error { print("\(error)") } else { // 正常 } }) } |
正常系、異常系でそれぞれ後続処理をここに書きます。
最後に呼び出し側です。
1 2 3 4 | let key = "AAA/BBB/sample.txt" let url = URL(fileURLWithPath: Bundle.main.url(forResource: resource, withExtension: "txt")) S3Util.download(key: key, url: url) |
以上、楽しい開発ライフを!