티스토리 뷰

Android/Firebase

[ Firebase #4 ] Firebase Storage

녹색꼬맹이 2020. 4. 17. 00:14
반응형
SMALL

FirebaseStorage는 문서, 사진, 파일, 동영상 등을 저장할 수 있는 저장공간

 

 

참고 : https://firebase.google.com/docs/storage/android/start?authuser=0#kotlin_1

 

Android에서 Cloud Storage 시작하기  |  Firebase

Firebase용 Cloud Storage를 사용하면 이미지 및 동영상 등의 사용자 제작 콘텐츠를 업로드 및 공유하여 앱에 리치 미디어 콘텐츠를 빌드할 수 있습니다. 데이터는 고가용성과 글로벌 중복성을 갖춘 엑사바이트급 객체 스토리지 솔루션인 Google Cloud Storage 버킷에 저장됩니다. Cloud Storage를 이용하면 이러한 파일을 휴대기기 및 웹브라우저에서 직접 안전하게 업로드할 수 있으며, 네트워크가 불안정해도 문제가 없습니다. 기본

firebase.google.com

참고: https://firebase.google.com/docs/firestore/query-data/get-data?hl=ko

 

Cloud Firestore로 데이터 가져오기  |  Firebase

두 가지 방법으로 Cloud Firestore에 저장된 데이터를 검색할 수 있습니다. 문서, 문서 컬렉션 또는 쿼리 결과에 대해 이러한 방법 중 하나를 사용할 수 있습니다. 메서드를 호출하여 데이터를 가져옵니다. 데이터 변경 이벤트를 수신하는 리스너를 설정합니다. 리스너를 설정하면 Cloud Firestore는 리스너에 데이터의 초기 스냅샷을 전송한 후 문서가 변경될 때마다 다른 스냅샷을 전송합니다. 참고: 코드 샘플에서는 여러 언어를 다루지만 샘플을 설

firebase.google.com

참고 : https://firebase.google.com/docs/storage/android/download-files?hl=ko#manage_downloads

 

Android에서 파일 다운로드  |  Firebase

Cloud Storage를 사용하면 Firebase가 제공하고 관리하는 Google Cloud Storage 버킷의 파일을 빠르고 손쉽게 다운로드할 수 있습니다. 참고: 기본적으로 Cloud Storage 버킷에서 파일을 다운로드하려면 Firebase 인증을 거쳐야 합니다. Cloud Storage에 대한 Firebase 보안 규칙을 변경하면 비인증 액세스를 허용할 수 있습니다. 기본 Google App Engine 앱과 Firebase가 이 버킷을 공유

firebase.google.com

 

반응형

 

파이어베이스에서 스토리지를 생성하게 되면 기본적으로 보안 규칙이 적용 됨.

allow read, wirte: if request.auth != null;
// Firebase 의 Authentication 에 등록된 사용자 만이 사용 가능

allow read, wirte: if true
// 모든 사용자 읽고 쓰기 가능

allow read, wirte: if false
// 모든 사용자 금지


match /userImg/{allPaths=**} {
    allow read,
    allow write: if request.resource.size < 10 * 1024 * 1024; // 10MB limit
}

 

참고 : https://firebase.google.com/docs/storage/security/start

 

저장소 보안 규칙 시작하기  |  Firebase

일반적인 앱에서 개발자는 인증, 권한 관리, 데이터 검증 및 개발자의 비즈니스 로직을 수행하는 여러 서버를 구축하고 관리해야 합니다. Firebase용 Cloud Storage를 사용하는 앱은 Firebase 인증 및 Cloud Storage용 Firebase 보안 규칙을 활용하여 서버리스 인증, 권한 부여, 데이터 검증을 처리합니다. Cloud Storage 및 저장소 보안 규칙을 사용하면 인프라를 관리하거나 복잡한 서버측 인증 및 권한 관리 코드를 작

firebase.google.com

 

 

 

// Storage
    implementation 'com.google.firebase:firebase-storage:19.1.1'
    implementation 'com.firebaseui:firebase-ui-storage:4.3.1'

스토리지를 사용하기 위해선 위에 있는 Gradle 파일 추가 ( 2번째 꺼는 나중에 데이터 다운받아올 때 사용하려고 적용 하는 것, 아래 내용 있음 )

 

 

private var profile: Uri? = null
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_CODE_GALLERY && resultCode == Activity.RESULT_OK) {
            if (data?.data == null) return
            profile = data.data!!	// Uri 를 저장
            setProfileImg(profile.toString())	// Glide를 이용하여 ImageView에 적용하는 매소드
        }
    }

폰 앨범 안에 있는 사진을 가져올 때 Uri 를 변수에 담아둔다.

 

 

그런다음 스토리지에 저장 하려면 ? 

FirebaseStorage
            .getInstance()
            .reference
            .child("userImg")	// userImg 폴더
            .child(firebaseAuth.currentUser?.email.toString()) // 최종 파일 이름으로 저장됨.
            .putFile(uri)
            .addOnSuccessListener {

            }
            .addOnFailureListener {
            
            }

userImg/파일이름 

루트로 저장됨.

 

 

그런다음 스토리지에서 이미지를 가져오려면 ? 

스토리지에 저장된 이미지를 가져오는 방법은 여러가지가 있지만, 

느리다.. 

 

근데 이번에 새로 알게 된것이 있는데 Glide를 이용해서 한번에 가져올 수 있다고 

 

아까 위에서 Glide 파일 2번째꺼 적용하라고 했던 부분이 여기서 쓰인다.

 

// App Build.Gradle

// 코틀린 일 경우 

apply plugin: 'kotlin-kapt'

implementation 'com.github.bumptech.glide:glide:4.10.0'
kapt 'com.github.bumptech.glide:compiler:4.10.0'
    
// 자바일 경우
implementation 'com.github.bumptech.glide:glide:4.10.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'

 

 

@GlideModule
class MyAppGlideModule: AppGlideModule() {

    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        registry.append(
            StorageReference::class.java, InputStream::class.java,
            FirebaseImageLoader.Factory()
        )

    }
}

MyAppGlideModule.class 혹은 .kt 

를 만든다. 

그냥 저렇게 만들어 놓고 클린 & 리빌드 하게 되면 알아서 적용 되는거 같음.

 

 

그렇다면 이제 부터 Glide 이 아닌 GlideApp 을 사용할 수 있게 된다. 

GlideApp.with(this)
	.load(파일경로) // ex) FirebaseStorage.getInstance().reference.child("userImg").child(userInfo?.img.toString())
	.placeholder(
		CircularProgressDrawable(iv_img.context).apply {
		strokeWidth = 5f
		centerRadius = 30f
		start()
		}
	)
	.error(R.drawable.iv_empty_profile)
	.transform(CenterCrop(), RoundedCorners(50))
	.into(iv_img)

 

Firebasestore 와 연동 할 수 있을까 하다가.. 음 그냥 이미지 이름만 저장 해 놓고 reference 로 가져와 바로 로딩 할 수 있어 편한 것 같음.

근데 좀 느림

그래서 PlaceHolder 및 error 옵션은 필 수 있듯.

 

 

근데 여기서 ? CircularProgressDrawable 이건 뭐냐 ? 

 

PlaceHolder 에서 로딩이 돌수 있게 하는 거..

implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"

 

약간 느낌있는거 같아서 적용해 봤음.

반응형
LIST
댓글