개발공부

[Android] Retrofit2 라이브러리 form-data 형식 파일, 텍스트 전송하기(Multipart form 이용) 본문

Android

[Android] Retrofit2 라이브러리 form-data 형식 파일, 텍스트 전송하기(Multipart form 이용)

mscha 2022. 7. 26. 10:23

아래와 같이 Heder로는 Authorization.

Body로는 form-data 형식의 key - value로 되어있는

File과 Text를 옮기는 방법을 알아보겠습니다.

 

 

결과

 

 

예제로는 이미지와 텍스트를 올리는 것으로 하겠습니다.

 

API 인터페이스

PostingApi

// 파일을 알아서 쪼개서 보내줌 @Multipart
@Multipart
@POST("/posting")
Call<PostingRes> addPosting(@Header("Authorization") String AccessToken,
                            @Part MultipartBody.Part photo,
                            @Part("content")RequestBody content);

 

PostingRes

public class PostingRes {
    private String result;


    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }
   
}

 

호출 부분

AddActivity

Retrofit retrofit = NetworkClient.getRetrofitClient(AddActivity.this);
PostingApi api = retrofit.create(PostingApi.class);

// 멀티파트로 파일을 보내는 경우, 파일 파라미터 만드는 방법
RequestBody fileBody = RequestBody.create(photoFile, MediaType.parse("image/*"));
// 키값, 파일명, 실제 파일
MultipartBody.Part photo = MultipartBody.Part.createFormData("photo",
        photoFile.getName(), fileBody);

// 멀티파트로 form-data형식 text 보내는 경우
RequestBody contentBody = RequestBody.create("보낼 텍스트", MediaType.parse("text/plain"));

// 헤더에 들어갈 억세스토큰 가져온다.
SharedPreferences sp = getApplication()
        .getSharedPreferences(Config.PREFERENCES_NAME, MODE_PRIVATE);
String accessToken = sp.getString("accessToken", "");


Call<PostingRes> call = api.addPosting("Bearer " + accessToken, photo, contentBody);


call.enqueue(new Callback<PostingRes>() {
    @Override
    public void onResponse(Call<PostingRes> call, Response<PostingRes> response) {
       
        if(response.isSuccessful()){
            Toast.makeText(AddActivity.this, "포스팅 완료", Toast.LENGTH_SHORT).show();
            finish();
        }else {
            Toast.makeText(AddActivity.this, "에러발생 : " + response.code(),
                    Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onFailure(Call<PostingRes> call, Throwable t) {
     
        // 네트워크 자체 문제로 실패
        Toast.makeText(AddActivity.this, "네트워크에 문제가 있습니다.", Toast.LENGTH_SHORT).show();
    }
});

 

이때 photoFile은 아래 게시글의 과정을 통해 얻어온 File형식의 변수입니다.

 

[Android] 카메라 / 앨범 처리

build.gradle 아래 코드를 추가합니다. dependencies { implementation 'commons-io:commons-io:2.4' } res/xml 경로 fileprovider.xml 파일을 생성합니다. fileprovider.xml <?xml version="1.0" encoding="utf-..

mscha.tistory.com