이제 이미지를 갤러리에 가져와 적용하는 것 까지 했으니 그 이미지를 서버로 부터 전송시키는 작업 또한 필요했다.
우선 서버 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시간 정도 시간을 쓴 것 같다. 하지만 시간을 많이 쓴 만큼 다음에는 한방에 할 수 있을 것 같다.