Swift 일기장 개발 일기 10 (Firebase Storage 이미지 업로드)

송민준·2023년 1월 21일
0

일기장 개발 일기

목록 보기
10/11
post-thumbnail

이미지나 동영상 파일은 데이터베이스보다는 스토리지에 올려놓는게 비용적으로 효율적이고 Firebase에 스토리지 서비스가 이미 있기 때문에 한번 써봤습니다. Amazon Web Service도 S3, DynamoDB등 훨씬 더 다양한 리소스를 제공하기 때문에 다음에 프로젝트한다면 AWS로 올려놓고 빌드시킬 생각이 있습니다.

설치는 Auth, Firestore에서도 다루기도 했고 같은 절차이기 때문에 이번 글에서는 생략하겠습니다.

DBViewModel

import FirebaseFirestore

class DBViewModel : NSObject {
    let storageViewModel = StorageViewModel()
    ...
    func makeDocument(uid:String, date:Date, emotion: String?, content: String, imageData: Data?){
    ...
                if let imageData = imageData {
                    self.storageViewModel.uploadImage(uID: uid, docID: ref!.documentID, imageData: imageData)
                }
            }
        }
    }
    ...
}

db에서 도큐먼트를 생성할 때 이미지를 업로드하도록 하겠습니다. 저는 이미지의 네임을 자동으로 생성된 docID로 하려고 도큐먼트를 만들 때 스토리지에 이미지를 저장했습니다.

StorageViewModel

import Foundation
import FirebaseStorage
class StorageViewModel : NSObject {
    let storage = Storage.storage()
    func uploadImage(uID:String, docID: String, imageData: Data){
        let storagePath = "gs://futurediary-1234.appspot.com/\(uID)/\(docID).jpg"
        let storageRef = storage.reference(forURL: storagePath)
        
        let uploadTask = storageRef.putData(imageData, metadata: nil){ (metadata, error) in
            guard let metadata = metadata else {
                print("Upload Image Task has Failed : \(error.debugDescription)")
                return
            }
            storageRef.downloadURL { (url, error) in
                guard let url = url else {
                    print("Downloading URL has Failed : \(error.debugDescription)")
                    return
                }
                
            }
        }
    }
}
  • let storage = Storage.storage(): Firebase Storage에 대한 포인터를 받습니다.

  • func uploadImage(uID:String, docID: String, imageData: Data): user의 document에 따라 이미지를 업로드하는 메서드입니다.

    • let storagePath = ...: 저장될 이미지의 경로입니다. DNS는 Firebase Storage 콘솔 메인화면에서 얻을 수 있습니다.
    • let storageRef = storage.reference(forURL: storagePath): 경로에 대한 레퍼런스를 얻습니다.
    • let uploadTask = storageRef.putData(imageData, metadata: nil){ (metadata, error) in: 데이터를 정의한 url 경로로 저장합니다.
      • storageRef.downloadURL { (url, error) in : 비동기식으로 오래 지속되는 다운로드 URL을 검색합니다. 저장 후 url을 복사하는 용도로 사용할 수 있을 것 같습니다.

테스트


Storage 콘솔에서 업로드됨을 확인했고 오른쪽 URL을 클릭하면 사진을 다운로드합니다.

다음 글은 처음 로그인했을 때 유저마다 외장 데이터베이스에서 정보들을, 스토리지에서 이미지를 가져와서 일기 리스트를 로드하는 것을 다루도록 하겠습니다.

profile
개발자

1개의 댓글

comment-user-thumbnail
2023년 1월 26일

잘보고가요

답글 달기