[Android] Firebase Cloud Storage로 파일 업로드 및 다운로드

송규빈·2022년 6월 7일
1

시작하기

시작하기는 별다른 문제 없이 공식 문서페이지에서 확인하면 됩니다.

버킷

Firebase Cloud Storage를 사용하여 파일을 저장하면 버킷에 저장된다고 합니다.

버킷의 모습은 대략 이러하다. 아직 앱으로 구현 전이기 때문에 웹에서 제공하는 '파일 업로드'를 통해
퇴직 증명서를 업로드해봤다.
버킷과 관련한 파일을 다루기 위해서는 해당 파일을 가리키는 참조를 만들어야합니다.

참조 만들기

파일 업로드, 다운로드, 삭제, 업데이트 등을 하려면 앱에서 참조를 만들어야합니다.
여기서 말하는 참조는 파일을 가리키는 포인터라고 생각하면 된다고 한다.

// storage:FirabaseStorage
  storage = Firebase.storage

  val storageReference = storage.reference

위와 같이 FirebaseStorage의 싱글톤 인스턴스를 사용하고, 이 인스턴스의 getReference()메서드로 참조를 만듭니다.

위에서 만든 참조로 child()메서드를 사용하여 하위 위치를 가리키는 참조를 만들 수 있습니다.


위 그림과 같이 파일이 있을 때 아래처럼 코드를 사용하여 파일을 가리키는 참조를 만들 수 있습니다.


val storageReference = storage.reference
val pdfReference = storageReference.child("pdf/퇴직_송규빈.pdf")

파일 업로드

Cloud Storage에 파일을 업로드하려면 파일 이름을 포함하여 파일의 전체 경로를 가리키는 참조를 만들어야합니다.

  val storageReference = storage.reference
  val pdfReference = storageReference.child("pdf/portfolio.pdf")

위 코드와 같이 업로드 할 파일의 위치 및 파일명에 대한 참조를 만든 후 putBytes(), putFile(), putStream() 메서드를 호출하여 업로드합니다.

파일 업로드

업로그 결과와 업로드를 일시중지, 재개, 취소 등도 처리할 수 있습니다.

val pdfUploadTask = pdfReference.putFile(uri)
pdfUploadTask.pause()
pdfUploadTask.resume()
pdfUploadTask.cancel()

 pdfUploadTask.addOnCompleteListener {
            Toast.makeText(this,"업로드 완료",Toast.LENGTH_LONG).show()
        }.addOnFailureListener{
            Toast.makeText(this,"업로드 실패",Toast.LENGTH_LONG).show()
        }

파일 다운로드

파일 다운로드도 업로드와 마찬가지로 다운로드할 파일을 가리키는 참조를 생성해야합니다.
그 후 여러가지 방식으로 다운로드할 수 있지만, 여기서는 내가 사용한 방법만 적겠습니다.
더 궁금한 것은 공식 문서를 참고하시기 바랍니다.

 val storageReference = storage.reference
 var downloadReference = storageReference.child("pdf/${binding.tvPdfName.text}")
        val destinationPath = Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS)
        val localFile = File.createTempFile("pdf",".pdf",destinationPath)
        downloadReference.getFile(localFile).addOnCompleteListener{
            Toast.makeText(this, "다운로드 완료",Toast.LENGTH_LONG).show()
            Log.d(TAG, "name: ${downloadReference.name}")
        }.addOnProgressListener {
            binding.tvDownloadProgress.text = "${it.bytesTransferred}/${it.totalByteCount}"
        }
profile
🚀 상상을 좋아하는 개발자

0개의 댓글