はじめに
こんにちは、初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に下記を記載して、インストールします。
1 2 3 | use_frameworks! pod'AWSS3' |
1 | $pod install |
認証の設定をする
冒頭で記載したとおり、今回はIAMユーザでの認証を行います。
accessKeyとsecretKeyにはAWSで作成したIAMユーザのものを設定してください。
下記の処理は、S3で画像などをアップロードする前に1度だけ実行するようにします。
1 2 3 4 5 6 7 8 | importAWSCore ... ... funcconfigureService(){ letcredentialsProvider=AWSStaticCredentialsProvider(accessKey:"your access key",secretKey:"your secret key") letserviceConfiguration=AWSServiceConfiguration(region:AWSRegionType.apNortheast1,credentialsProvider:credentialsProvider) AWSServiceManager.default().defaultServiceConfiguration=serviceConfiguration } |
UIImageを保存して、URLを取得する
S3へ投稿するファイルは、一時的に端末内に保存して、そのURLをS3のSDKに指定する必要があります。
下記のメソッドで、S3へのアップロードする画像が保存されているURLを取得できます。
1 2 3 4 5 6 7 | private funcgenerateImageUrl(_uploadImage:UIImage)->URL{ letimageURL=URL(fileURLWithPath:NSTemporaryDirectory().appendingFormat("upload.jpg")) ifletjpegData=UIImageJPEGRepresentation(uploadImage,80){ try!jpegData.write(to:imageURL,options:[.atomicWrite]) } returnimageURL } |
S3へアップロードする
下記のメソッドでS3へアップロードができます。
下記のメソッドを呼ぶ前には、上記で記載している認証の設定を事前に実行する必要があります。
また、「uploadRequest?.bucket
」にはAWS上で作成したバケット名を指定し、「uploadRequest?.key
」にはS3上に保存したいファイル名を指定します。
なお、ファイル名はtest/hello.jpgとするとAWSコンソールなどから見た際にtestフォルダ内にhello.jpgファイルが保存されているように見えるので、ファイルをまとめて管理したい場合には、「test/」などのプレフィックスをつけるとよいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | importAWSS3 ... ... public funcuploadImage(_uploadImage:UIImage){ lettransferManager=AWSS3TransferManager.default() letuploadRequest=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 iftask.error!=nil||task.exception!=nil{ // エラー } returnnil }) } |
さいごに
直近のプロジェクトで、S3へ画像をアップロードする必要があったので調べてみました。
ぜひ、ご参考にしていただければと思います。