본문 바로가기

ios 앱개발

[SWIFT] IOS에서 AWS Amplify를 이용해 이미지 저장과 불러오기(S3 storage)

반응형

안녕하세염.

이번에는 AWS Amplify에서 S3 storage에 이미지를 저장하고 불러오는 방식을 소개하겠습니다.

 

AWS Amplify와 S3 Storage세팅의 경우 공식문설를 참고하시면 됩니다.

https://docs.amplify.aws/swift/start/getting-started/

 

Getting started - Swift - AWS Amplify Documentation

Start building an app using Amplify, including installing Amplify CLI, initializing a project, and deploying it. AWS Amplify Documentation

docs.amplify.aws

 

1. 이미지 선택하기

우선 저장할 이미지를 휴대폰에서 가져와야 합니다.

 

 

 

위 사진과 같이 저장 할 이미지를 스마트폰에서 가져오기 위한 코드부터 우선적으로 소개해 보겠습니다.

extension AddArticleViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate{
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            imageView.image = image
            
            let uuid = UUID().uuidString
            let fileName = "\(uuid).jpeg"
                        
            let url = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
                .appendingPathComponent(uuid, isDirectory: false)
                .appendingPathExtension("jpeg")
            
        
            if let data = image.jpegData(compressionQuality: 0.8) {
                do {
                    try data.write(to: url)
                    
                    self.selectedFileName = fileName
                    self.selectedFileUrl = url
                    
                    uploadImageOrigin(url: url, fileName: fileName) //Call the updated function to store to AWS bucket

                } catch {
                    let error = UIAlertController(title: "ERROR", message: "Handle the error, i.e. disk can be full", preferredStyle: UIAlertController.Style.alert)
                    let yError = UIAlertAction(title: "확인", style: UIAlertAction.Style.default, handler: nil)
                    error.addAction(yError)
                    present(error, animated: true, completion: nil)
                }
            }
            print(info)
        }
        dismiss(animated: true, completion: nil)
    }
}

 

해당 코드의 경우 아이폰의 사진 앱이나 카메라로 부터 이미지를 불러오는 코드입니다.

사진을 사용자가 만든 앱으로 가져올 때는 jpeg 형식으로 가져오게 됩니다.

 

2. S3 Storage에 이미지 저장하기

이미지를 저장하기위해서는 저장할 이미지의 이름과 경로로 s3 storage에 저장하게 됩니다.

    func uploadImageOrigin(url: URL, fileName: String){
        
        let localImageUrl = url
        let fileNameKey = fileName
        
        let uploadTask = Amplify.Storage.uploadFile(
            key: fileNameKey,
            local: localImageUrl
        )
        progressSink = uploadTask
            .inProcessPublisher
            .sink { progress in
                print("Progress: \(progress)")
            }

        resultSink = uploadTask
            .resultPublisher
            .sink {
                if case let .failure(storageError) = $0 {
                    print("Failed: \(storageError.errorDescription). \(storageError.recoverySuggestion)")
                }
            }
            receiveValue: { data in
                print("Completed: \(data)")
            }
    }

 

 

3. S3 Storage로 부터 이미지 가져오기

s3 storage로 부터 이미지를 가져올 때 역시, 가져올 이미지의 이름과 경로를 알고 있어야 합니다.

    func downloadImage(fileName: String) async -> UIImage {
        let url: URL
        do {
            url = try await Amplify.Storage.getURL(key: fileName)
        } catch {
            print("Failed to get URL for image in homeview: \(error)")
            return UIImage(named: "Luvky_Icon.png")!
        }
        let downloadTask = Amplify.Storage.downloadFile(
            key: fileName,
            local: url,
            options: nil
        )
        Task {
            for await progress in await downloadTask.progress {
                print("Progress: \(progress)")
            }
        }
        do {
            let (data, _) = try await URLSession.shared.data(from: url)
            let image = UIImage(data: data) ?? UIImage(named: fileName)!
            return image
        } catch {
            print("Failed to get URL for image: \(error)")
            print(url)
            return UIImage(named: "Luvky_Icon.png")!
        }
    }

 

 

s3 storage에 관한 내용은 이렇게가 끝입니다.

저 같은 경우 어떻게 이미지를 다뤄야 할지 몰라서 오랜 시간이 걸렸는데,

이 글을 보시게 되는 분들은 적어도 제 앱에서는 잘 작동하기 때문에

믿고 사용하셔도 됩니다.

 

이렇게 이번 주제는 끝을 내도록 하고,

다음 주제는 ios에서 카카오 로그인 구현 방법에 대하여 작성하겠습니다.

 

반응형