Firebase
의 Storage
는 이미지와 영상을 저장할 수 있는 원격 저장소로 이미지를 업로드하고 해당 이미지의 URI를 받아올수 있다.
나중에 알아봐야할 Firestore
에는 이미지를 업로드 할 수 없기 때문에 Storage
에 이미지를 업로드하고 URI를 받아서 저장하는 방식을 사용해야했다.
Firebase
에서 Storage
시작하기를 통해 새로운 Storage
를 생성한다.
이전에 설명했던 Authentication
의 경우에는 아무런 제약없이 생성후 바로 사용이 가능했지만,
Storage
의 경우에는 데이터에 보안규칙을 적용해야하기 위해 보안규칙을 작성해야 사용이 가능하다.
이 보안규칙은 규칙 탭에서 언제든 수정이 가능하다.
그후 Cloud Storage
의 기본위치를 asia-northeast3(서울)
로 지정해준다. 완료 버튼을 클릭하면 Storage
가 생성된다.
웹상에서 파일을 직접 업로드 할 수 있으며, 앱에서 코드를 사용해 업로드 하는 방식을 사용할 수도 있다.
안드로이드 스튜디오에서 Firebase.storage
를 선언해 Storage
객체를 생성해 준 뒤 .reference
메서드를 사용해 레퍼런스 객체를 불러온다.
private val storage by lazy { Firebase.storage }
private val storageRef by lazy { storage.reference }
우선 Storage Reference
의 .child
메서드를 사용해 이미지가 저장될 Reference
를 생성해준다. 이때 레퍼런스의 이름이 될 pathString
을 입력해 이미지별로 다른 저장공간을 생성할 수 있다.
auth
를 사용해 각 유저의 고유 uid
와 업로드한 시간을 조합하면 이미지별로 겹치지 않는 고유한 이름을 생성할 수 있기에 해당 방식을 사용해 이미지별로 다른 Reference
에 저장될 수 있도록 코드를 구성했다.
val fileName = SimpleDateFormat("yyyyMMddHHmmss").format(Date())
val pathString = "${uid}${fileName}.png"
val imageRef = storageRef.child(pathString)
안드로이드 내에서 Intent
나 다른 방법을 통해 이미지 Uri
를 불러올 경우 위에서 생성한 Image Reference
에 .putFile
메서드를 사용해 해당 Uri
를 입력해준다.
Firebase auth
와 같이 .addOnCompleteListener { ... }
로 성공 실패시의 task
별로 로직을 따로 분리할 수 있다.
이미지가 성공적으로 Strage
에 업로드되면 해당 이미지의 Uri를 받아올 수 있다.
Storege
에 저장된 해당 이미지의 Reference
가져온뒤 .downloadUrl
메서드를 사용하면 해당 이미지의 Uri를 가져오는게 가능하다.
val imageRef = storageRef.child(pathString)
imageRef.downloadUrl
진짜.. 잠은 언제자...?
(캠프 끝나고!)