안드로이드 스튜디오 이미지 서버로 전송하기(Retropit2 multipart사용)

개린이의 개발 노트·2023년 8월 2일
1

이제 이미지를 갤러리에 가져와 적용하는 것 까지 했으니 그 이미지를 서버로 부터 전송시키는 작업 또한 필요했다.

우선 서버 API를 살펴보았다.

요청 API는 다음과 같다.
curl --location '서버 주소/user/image' \
--header 'Authorization: Bearer 토큰 정보' \
--form 'file=@"/이미지 경로"'

그래서 Retrofit인터페이스를 다음과 같이 구현하였다.

@Multipart
    @POST("user/image")
    fun editImage(
        @Header("Authorization") authorization: String?,
        @Part image: MultipartBody.Part
    ) : Call<EditUserImage>

여기서 쓰인 multipart는 서버로부터 파일을 보낼 때 쓰인다고 한다.
현재 이미지 파일을 서버로 보내야 하니 사용했다.

요거는 서버로 부터 요청을 보내고 응답을 받는 부분이다.

fun sendImage(imageFile: File){
        val responseImage = getRetrofit().create(RetrofitInterface::class.java)
        val refreshToken = getRefreshToken(this)

        val authHeader = "Bearer $refreshToken"
        val requestFile = imageFile.asRequestBody("image/png".toMediaTypeOrNull())
        val filePart = MultipartBody.Part.createFormData("file", imageFile.name, requestFile)

        responseImage.editImage(authHeader, filePart).enqueue(object : retrofit2.Callback<EditUserImage> {
            override fun onResponse(call: Call<EditUserImage>, response: Response<EditUserImage>) {
                if (response.isSuccessful) {
                    val resp = response.body() // 성공했을 경우 response body불러오기
                    Log.d("SIGNUP/SUCCESS", resp.toString())
                    Log.d("성공!", "success")
                } else {
                    // 실패 처리
                }
            }

            override fun onFailure(call: Call<EditUserImage>, t: Throwable) {
                Log.d("SIGNUP/FAILURE", t.message.toString()) // 실패한 이유 메세지 출력
            }
        })
    }

로그에도 서버로 부터 통신에 성공했다고 뜬다!

사실 처음에는
imageFile.asRequestBody("image/png".toMediaTypeOrNull()) 요 부분을

imageFile.asRequestBody("image/*".toMediaTypeOrNull()) 이런 식으로 썼었다.
그랬더니 서버로부터 요청이 성공했다고 뜨나 서버에는 이미지를
이미지경로.%2A 형식으로 받고 나중에 서버로 부터 이미지를 가져올 때 제대로 가지고 오지 못하는 현상이 발생했다.

한참 헤메대가 서버측으로 부터 jpg나 png파일만 지원한다는 얘기를 듣고 어떻게 해야 파일을 png, jpg형식으로 보낼 까 엄청 시도하다가 저 구문이 수상해서 한번 바꿔보았더니 해결이 되었다.(진짜 우연히 해결이 된 케이스)

여기서 3시간 정도 시간을 쓴 것 같다. 하지만 시간을 많이 쓴 만큼 다음에는 한방에 할 수 있을 것 같다.

profile
개발 처음 시작함..... 그러니 잘못되거나 다소 이해안가는 코드들도 있을 수 있습니다 이점 양해 부탁드려요

0개의 댓글