
🎉 개요
안드로이드에서 서버측에 이미지를 받는 과정에서 Base64로 인코딩하여 전달 받습니다. 이 과정에서 이미지 처리가 정확히 어떻게 이루지는 것인지 한번 알아보겠습니다.
🎉 이미지 전송
갤러리에서 가져온 이미지의 Uri를 절대 경로로 반환합니다. 상대 경로를 사용하는 이유는 상대 경로보다 절대 경로를 사용하는 것이 더 정확하다고 하네요!
// 절대경로 변환
fun absolutelyPath(path: Uri, context : Context): String {
val proj: Array<String> = arrayOf(MediaStore.Images.Media.DATA)
val c: Cursor? = context.contentResolver.query(path!!, proj, null, null, null)
val index = c?.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
c?.moveToFirst()
val result = c?.getString(index!!)
return result!!
}
서버측에 전송할 enctype 은 Multipart입니다.
HTTP multipart/form-data
이번엔 node.js로 이미지를 전송하는 서버를 만들던 중 multipart/form-data란 개념이 있어 알아보고 HTTP, multipart에 대해서도 알아보겠습니다. 1. HTTP(Hypertext Transfer Protocol)란? 인터넷 상에서 클라이언트
chanho-study.tistory.com
@Multipart
@POST("/db/upload") // 서버 엔드포인트 URL, HTTP POST 요청
suspend fun registStore(
@Part storeimage: MultipartBody.Part, // 이미지 데이터를 나타내는 파라미터
@Part("storename") storename: RequestBody,
@Part("ceoName") ceoName: RequestBody,
@Part("CRN") CRN: RequestBody,
@Part("contact") contact: RequestBody,
@Part("address") address: RequestBody,
@Part("latitude") latitude: RequestBody,
@Part("longitude") longitude: RequestBody,
@Part("kind") kind: RequestBody
): ResponseBody
- file : 절대 경로로 가져온 이미지를 통해 File 객체를 생성합니다.
- requestFile : 파일을 RequestBody로 변환합니다. image/*는 파일의 MIME 타입을 나타내며, 이 경우에는 이미지 파일을 나타냅니다.
- body : Retrofit interface에 POST Request에서 storeImage의 Type이 MulitpartBody.part로 지정되어있습니다. 그러므로 최종 Data Type은 Multipartbody.Part Type이여야 합니다.
val file = File(absolutelyPath(imgUri, context))
val requestFile = file.asRequestBody("image/*".toMediaTypeOrNull())
val body = MultipartBody.Part.createFormData("storeimage", file.name, requestFile)
🎉 이미지 받기
저는 서버에서 이미지를 전송할 때 Base64로 인코딩하여 전송하였습니다. Base64란 무엇일까요 ?
- 이진 데이터를 텍스트로 인코딩합니다. 이진 데이터를 ASCII 문자로만 이루어진 문자열로 변환합니다
- 주로 바이너리 데이터를 텍스트 형식으로 전송하거나 저장할 때 사용됩니다.
fun StringToBitmaps(image: String): Bitmap? {
try{
val encodedByte: ByteArray = Base64.decode(image, Base64.DEFAULT);
val bitmap: Bitmap = BitmapFactory.decodeByteArray(encodedByte, 0, encodedByte.size)
return bitmap
}catch (e: Exception){
Log.d("StringToBitmaps", "$e")
return null
}
}
- 서버에서 Base64로 전송한 데이터를 디코딩하여 ByteArray로 변환합니다.
- 디코딩된 이미지를 Bitmap 객체로 변환합니다.
'Android' 카테고리의 다른 글
| [Android]Android Memory Process (1) | 2024.01.07 |
|---|---|
| Android Daum 우편번호 서비스 API With FireBase Hosting (2) | 2024.01.04 |
| Android LayoutInflater (2) | 2023.12.26 |
| Android Fragment Life Cycle (1) | 2023.12.26 |
| Android Activity Life Cycle (3) | 2023.12.26 |