티스토리 뷰

반응형

안녕하세요 Gons 입니다.

오늘은 AWS S3 사용법을 메모해놓겠습니다.

앱에서 아마존 웹서비스 스토리지를 사용해야할 일이 생겼습니다.

공식사이트를 보니 Amplify 라는 SDK 로 하는 것 같은데

회사에서는 앰플리파이를 사용하지 않고 S3 만 사용하라는 오더도 있었어서

Amplify 없이 스토리지를 사용해보겠습니다.

 

 

 

pod 'AWSS3'

이런식으로 설치해주세요.

 

 

 

 

 

이미지를 하나 넣어주세요.

 

 

 

 

 

 

 

버튼 2개와 이미지뷰를 넣어주세요.

 

 

 

 

import UIKit

import AWSS3

class ViewController: UIViewController {

    @IBOutlet weak var imgView: UIImageView!
    
    let bucketName = "myapp-bucketname"
    let accessKey = "SSGASLNTTCLXGJNPRLNE"
    let secretKey = "60ayImDHNVF+HmgP5TCrOzvLIspqBFmpbKShOfxA"
    let utilityKey = "utility-key"
    var fileKey = "profile/image/"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let credentialsProvider = AWSStaticCredentialsProvider(accessKey: accessKey, secretKey: secretKey)

        let configuration = AWSServiceConfiguration(region:.APNortheast2, credentialsProvider:credentialsProvider)
        AWSServiceManager.default().defaultServiceConfiguration = configuration

        let tuConf = AWSS3TransferUtilityConfiguration()
        tuConf.isAccelerateModeEnabled = false

        AWSS3TransferUtility.register(
            with: configuration!,
            transferUtilityConfiguration: tuConf,
            forKey: utilityKey
        )
        
        let dateFormat = DateFormatter()
        dateFormat.dateFormat = "yyyyMMdd/"
        fileKey += dateFormat.string(from: Date())
        fileKey += String(Int64(Date().timeIntervalSince1970)) + "_"
        fileKey += UUID().uuidString + ".png"
        
    }

    func upload() {
        

        guard let transferUtility = AWSS3TransferUtility.s3TransferUtility(forKey: utilityKey)
        else
        {
            return
        }

        let expression = AWSS3TransferUtilityUploadExpression()
        expression.setValue("public-read", forRequestHeader: "x-amz-acl") //URL로 이미지 읽을 수 있도록 권한 설정 (이 헤더 없으면 못읽음)
        expression.progressBlock = {(task, progress) in
            print("progress \(progress.fractionCompleted)")
        }
        
        var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
        completionHandler = { [weak self] (task, error) -> Void in
            guard let self = self else { return }
            print("task finished")
            
            let url = AWSS3.default().configuration.endpoint.url
            let publicURL = url?.appendingPathComponent(self.bucketName).appendingPathComponent(self.fileKey)
            if let absoluteString = publicURL?.absoluteString {
                print("image url ↓↓")
                print(absoluteString)
            }
            
            if let query = task.request?.url?.query,
               var removeQueryUrlString = task.request?.url?.absoluteString.replacingOccurrences(of: query, with: "") {
                removeQueryUrlString.removeLast() // 맨 뒤 물음표 삭제
                print("업로드 리퀘스트에서 쿼리만 제거한 url ↓↓") //이 주소도 파일 열림
                print(removeQueryUrlString)
            }
        }



        guard let data = UIImage(named: "img")?.pngData()
        else
        {
            return
        }

        transferUtility.uploadData(data as Data, bucket: bucketName, key: fileKey, contentType: "image/png", expression: expression,
        completionHandler: completionHandler).continueWith
        {
            (task) -> AnyObject? in
            if let error = task.error {
                print("Error: \(error.localizedDescription)")

            }

            if let _ = task.result {
                print ("upload successful.")
            }

            return nil
        }
    }
    
    func download() {
        
        
        guard let transferUtility = AWSS3TransferUtility.s3TransferUtility(forKey: utilityKey)
        else
        {
            return
        }

        let expression = AWSS3TransferUtilityDownloadExpression()
        expression.progressBlock = {(task, progress) in
            print("progress \(progress.fractionCompleted)")
        }
        
        var completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock?
        completionHandler = { (task, url, data, err) -> Void in
            print("task finished")
            
            DispatchQueue.main.async { [weak self] in
                
                if let d = data {
                    print("img data 있음")
                    self?.imgView.image = UIImage(data: d)
                }
            }
        }
        
        
        transferUtility.downloadData(fromBucket: bucketName, key: fileKey, expression: expression, completionHandler: completionHandler).continueWith
        {
            (task) -> AnyObject? in
            if let error = task.error {
                print("Error: \(error.localizedDescription)")
            }
            
            if let _ = task.result {
                print ("download successful.")
            }
            return nil
        }
        
    }
    
    @IBAction func upload(_ sender: UIButton) {
        upload()
    }
    
    
    @IBAction func download(_ sender: UIButton) {
        download()
        
    }
}

전체 코드입니다.

img 라는 이미지를 S3 에 업로드하고

버킷네임과 파일키로 이미지를 다운받아서 이미지뷰에 표시합니다.

 

 

 

 

 

 

업로드 시에 이렇게 로그가 나오고

저 https 주소 2가지 형식 모두 이미지가 잘 열립니다.

 

 

다운로드 시에는 이렇게 로그가 나옵니다.

 

 

 

 

이상입니다.

액세스키와 시크릿키, 버킷명과 폴더경로만 본인꺼로 바꾸셔서 사용하면 됩니다.

 

 

 

 

 

iOS

Swift

Xcode

반응형
댓글
300x250
반응형
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday