본문 바로가기

ios 앱개발

ios에서 AWS Amplify S3를 이용하여 image upload, download하기

반응형

정말 오랫만에 글을 쓰게 되었습니다.

 

이번에 소개하고자 하는 내용은 제목과 동일하게 ios에서 ~입니다.

 

upload와 download method의 경우 공식문서를 참조하였습니다.

(공식문서 링크)

 

우선 schema.graphql의 경우 매일 가물가물해서 수정방법을 말해보자면

1. xcode를 이용해 shema.graphql에 들어가 내용을 변경한다.

2. 변경 후 터미널을 키고 cd -> finder켜서 해당 project가 속한 dir을 drag한다.

3. 해당 dir에 접근했다면 amplify codegen models 입력한다.

 

이렇게 하면 된다.

 

이번에는 upload method에 대해 작성하겠다. 

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)")
}
}

여기서 포인트는 url이다. 이거 때문에 정말 많이 헤맸는데

upload시의 url의 경우 simulator에서의 url이 적용되면 성공한거다.

 

 

이번에는 download method에 대하여 알아보겠다.

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

비동기 처리로 구현하였다. 또한 return 값을 UIImage로 설정하여 TableViewCell에서 바로 이용이 가능하게 만들었다.

 

여기서 포인트 역시 url인데 upload에서 사용한 url과 같으면 절대 안된다. 이것 때문에 계속 에러가 떴는데

download에서의 url의 경우 S3에 저장된 url을 불러와야지만 된다. 정말 단순한 사실이지만 햇갈렸다.

 

또한 위에 주석처리된 contentsOf의 경우 ios14? 부터 대충 depreciate 되었다고 해서 URLSession방식으로 바꿔주었다.

바꾸지 않았을 때 무슨 보라색으로 에러뜨던데 그런거 처음밨다.

 

쨋든 이렇게 만들었다.

 

대충 수 많은 시행착오를 겪고 그랬음

반응형