カテゴリー: iOS

SwiftでS3への画像アップロード

はじめに

こんにちは、初iOSの記事になります!

今回はSwiftでAWSのS3へ画像をアップロードする方法について、ブログを書きたいと思います。

AWS Cognitoでの認証が本来は望ましいのですが、今回は簡単にIAMユーザを作成し、ACCESS KEYとSECRET ACCESS KEYを利用した方法で紹介したいと思います。

アプリをリリースする場合は、AWS Cognitoを利用するか、IAMユーザの場合はアクセス権限を十分に絞ってください。

AWS上での事前準備

AWS上での準備については、省略しますが下記の2つを準備してください。

IAMユーザについては、作成したS3のバケットへアップロード(PutObject)できる権限を付与しておく必要があります。

  • S3にバケットを作成
  • IAMユーザの作成(上記のバケットへの「s3:PutObject」権限あり)

CocoaPodsでAWS SDKをインストールをする

Podfileに下記を記載して、インストールします。

use_frameworks!

pod 'AWSS3'
$ pod install

認証の設定をする

冒頭で記載したとおり、今回はIAMユーザでの認証を行います。

accessKeyとsecretKeyにはAWSで作成したIAMユーザのものを設定してください。

下記の処理は、S3で画像などをアップロードする前に1度だけ実行するようにします。

import AWSCore
...
...
    func configureService() {
        let credentialsProvider = AWSStaticCredentialsProvider(accessKey: "your access key", secretKey: "your secret key")
        let serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.apNortheast1, credentialsProvider: credentialsProvider)
        AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration
    }

UIImageを保存して、URLを取得する

S3へ投稿するファイルは、一時的に端末内に保存して、そのURLをS3のSDKに指定する必要があります。

下記のメソッドで、S3へのアップロードする画像が保存されているURLを取得できます。

private func generateImageUrl(_ uploadImage: UIImage) -> URL {
    let imageURL = URL(fileURLWithPath: NSTemporaryDirectory().appendingFormat("upload.jpg"))
    if let jpegData = UIImageJPEGRepresentation(uploadImage, 80) {
        try! jpegData.write(to: imageURL, options: [.atomicWrite])
    }
    return imageURL
}

S3へアップロードする

下記のメソッドでS3へアップロードができます。

下記のメソッドを呼ぶ前には、上記で記載している認証の設定を事前に実行する必要があります。

また、「uploadRequest?.bucket」にはAWS上で作成したバケット名を指定し、「uploadRequest?.key」にはS3上に保存したいファイル名を指定します。

なお、ファイル名はtest/hello.jpgとするとAWSコンソールなどから見た際にtestフォルダ内にhello.jpgファイルが保存されているように見えるので、ファイルをまとめて管理したい場合には、「test/」などのプレフィックスをつけるとよいでしょう。

import AWSS3
...
...
    public func uploadImage(_ uploadImage: UIImage) {
        let transferManager = AWSS3TransferManager.default()
        let uploadRequest = AWSS3TransferManagerUploadRequest()
        uploadRequest?.bucket = "your S3 bucket name"
        uploadRequest?.key = "your file name on S3"
        uploadRequest?.body = generateImageUrl(uploadImage)
        transferManager?.upload(uploadRequest).continue({ (task: AWSTask) -> Any? in
            if task.error != nil || task.exception != nil {
                // エラー
            }
            return nil
        })
    }

さいごに

直近のプロジェクトで、S3へ画像をアップロードする必要があったので調べてみました。

ぜひ、ご参考にしていただければと思います。

naoki85

シェア
執筆者:
naoki85
タグ: SwiftAWS

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前