요즘 생산되는 앱들은 다른 사용자와 상호작용을 하는 게 대부분이기 때문에
클라이언트에서 생성된 컨텐츠를
상황에 따라 서버에 저장하고 공유해야 할 상황이 옵니다.
따라서 이번에는 aws S3에 파일을 업로드하는 방법에 대해 알아봅시다.
아래는 해당 과정에 대해 아주 상세하게 잘 정리된 글을
찾아서 링크를 첨부했습니다.
첨부된 링크에서는 Download 부분에 대해 설명이 되어 있기에
추가로 Upload 코드를 추가 했습니다.
http://progtrend.blogspot.com/2019/06/android-aws-s3.html
위의 사이트를 글을 통해
Cognito 자격 증명 풀 생성 및
생성된 자격 증명 풀에 S3 접근 권한 부여를 합니다.
다음으로 안드로이드 gradle 설정 및 다른 코드를 복사한 후
Sync now 를 눌러 라이브러리를 다운로드합니다.
다음으로 아래 코드를 추가하여 파일을 업로드 하시면 됩니다.
fun uploadWithTransferUtility(fileName: String, file: File) {
val credentialsProvider = CognitoCachingCredentialsProvider(
applicationContext,
AWS_POOL_ID, // 자격 증명 풀 ID
Regions.AP_NORTHEAST_2 // 리전
)
TransferNetworkLossHandler.getInstance(applicationContext)
val transferUtility = TransferUtility.builder()
.context(GSApplicationClass.getInstance())
.defaultBucket(AWS_STORAGE_BUCKET_NAME)
.s3Client(AmazonS3Client(credentialsProvider, Region.getRegion(Regions.AP_NORTHEAST_2)))
.build()
/* Store the new created Image file path */
val uploadObserver = transferUtility.upload("BUCKET_PATH/${fileName}", file, CannedAccessControlList.PublicRead)
//CannedAccessControlList.PublicRead 읽기 권한 추가
// Attach a listener to the observer
uploadObserver.setTransferListener(object : TransferListener {
override fun onStateChanged(id: Int, state: TransferState) {
if (state == TransferState.COMPLETED) {
// Handle a completed upload
}
}
override fun onProgressChanged(id: Int, current: Long, total: Long) {
val done = (((current.toDouble() / total) * 100.0).toInt())
Log.d("MYTAG", "UPLOAD - - ID: $id, percent done = $done")
}
override fun onError(id: Int, ex: Exception) {
Log.d("MYTAG", "UPLOAD ERROR - - ID: $id - - EX: ${ex.message.toString()}")
}
})
// If you prefer to long-poll for updates
if (uploadObserver.state == TransferState.COMPLETED) {
/* Handle completion */
}
}
사용 방법은
uploadWithTransferUtility(fileName: String, file: File)
fileName : 업로드할 File 의 이름 설정,
file: 업로드할 파일
만약 외부 Url 링크 이미지를 다운로드 하여 파일로 변환 후
서버에 업로드 하고 싶으시면,
https://sweetcoding.tistory.com/156 여기를 참고해
응용하시기 바랍니다.
주의 할점은
transferUtility.upload("BUCKET_PATH/${fileName}", file)
BUCKET_PATH 같은 경우
예를 들어 AWS_STORAGE_BUCKET_NAME 이 "sample"이고
해당 버킷 안에 디렉토리가
test라는 폴더가 있으면
BUCKET_PATH는 그냥 test 가 됩니다.
/test 이런식으로 입력하면 이름이 없는 디렉터리가 추가되고 파일이 추가되어
관리자 페이지에서 쉽게 폴더 삭제가 되지 않으니 참고 바랍니다.
내용 추가 2020.03.09
깜빡하고 코드에 옵션을 빼놓았다...
파일 업로드시 파일의 PublicRead 권한을 주지 않으면,
서버에 정상적으로 업로드는 되어도
제공되는 객체 URL을 통해 접근을 할수가 없다.
만약 사용자의 프로필 이미지 같이 업로드된 이미지가
다른 유저들도 볼수 있어야 한다면 옵션을 추가해 주면 된다.
'공부방 > Android' 카테고리의 다른 글
행복한 코딩을 위하여!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!