공상하는 개발자

[안드로이드] 서버에 form data 로 데이터 전송하기.(MultiPart) 본문

개발/안드로이드

[안드로이드] 서버에 form data 로 데이터 전송하기.(MultiPart)

공상과학소설 2020. 7. 14. 19:06
반응형

프로젝트를 진행하면서 pdf, image 같은 데이터를 form-data로 넘겨줘야 하는 상황에 맞닥뜨렸다..

form-data  파일을 바디에 넣어서 보내줘야한다.

데이터를 넘겨주는 것은 해보지 않아서 약간 겁먹었었는데, 

해보고 나니 모든 타입의 데이터를 전송할 수 있을 것 같다는 생각이 들었다.

기억을 잊어먹지 않기위해 프로젝트 도중에 블로그를 쓴다. 


해결 과정

1. 저장소 퍼미션을 준다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

-> 저장소의 데이터를 저장하고 확인할 수 있는 퍼미션이다.

2. File 객체를 만들어준다. ( 파일의 경로를 가져와야 한다.)

val file = File("파일의 경로")	// 경로 예시 : /storage/emulated/0/Download/filename.pdf

3. 가져온 File 객체를 RequestBody 객체로 변환하는 작업을 해준다.

val requestFile = RequestBody.create(MediaType.parse("application/pdf"), file)

-> MediaType.pase("변환할 대상") parse 안에 String 값을 바꿔줌으로써 pdf도 보낼 수 있고, image 도 가능하고 다 가능하게 해 준다.

     밑의 사이트는 변환하는 String 값들이 자세하게 적혀있으니 본인이 원하는 타입을 적고 변환할 수 있을 것이다.

 

MIME 타입

MIME 타입이란 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘입니다: 웹에서 파일의 확장자는 별  의미가 없습니다. 그러므로, 각 문서와 함께 올바른 MIME 타입을 전송하도�

developer.mozilla.org

4. 우리에게 필요한 Multipart.Part로 변환해준다.

val body = MultipartBody.Part.createFormData("file", file.name, requestFile)

5. 서버와 통신하는 부분을 만들어준다.

@Multipart
@POST("/orders/{order_idx}/file")
    fun sendFile(
        @Path("order_idx") orderIdx: Int,
        @Part file: MultipartBody.Part	// 이 부분이 우리가 넣을 데이터!!
    ): Call<FileResponse>

-> Multipart 어노테이션을 붙여줘야 한다. 그래야 MultipartBody.part를 넣을 수 있다.

6. 레트로핏을 통해 통신을 완성해준다.

BoosterServiceImpl.service.sendFile(1, body)	// body 가 Multipart.Part
                .enqueue(object : Callback<FileResponse> {
                    override fun onFailure(call: Call<FileResponse>, t: Throwable) {
                        Log.e("error : ", t.message)
                    }

                    override fun onResponse(
                        call: Call<FileResponse>,
                        response: Response<FileResponse>
                    ) {
                        ...
                    }
                })

7. 결과를 확인한다.

-> 아주 잘 들어가는 것을 알 수 있다!!


시행착오

1. header에 인터셉터로 content-type에 application/json을 넣어줬는데, 그걸 넣으니까 서버와의 통신이 안됐다... 필요한 헤더 이외에는 다 지워주자...

2. MediaType.pase("변환할 대상") 여기에 넣는 String 값에서 막혔었다.. 다른 사람의 도움을 받아 어떤 것을 넣는지 알았으니 다음부터 바로바로 해보자..


데이터를 서버에 보내는 작업은 처음이었는데, 한번 해보니

또다시 할 프로젝트가 있을 때 많은 도움이 될 것 같다.

매우 뜻깊은 경험이었다.

반응형
Comments