본문 바로가기
Android

[Android] Multipart를 이용한 사진파일 포스트 API

by eyoo 2022. 7. 26.

Retrofit을 이용하여 사진과 글을 전송하는 API를 이용하려고 한다.

 

 

사진은 용량이 커서 네트워크를 통해 걸리는 시간이 많기 때문에 Multipart를 이용해야 한다.

 

먼저 포스팅하는 API를 인터페이스로 만든다.

 

public interface PostingApi {

    @Multipart
    @POST("/posting")
    Call<PostRes> addPosting(@Header("Authorization") String token,
                             @Part MultipartBody.Part photo,
                             @Part("content")RequestBody content);
}

# Multipart를 사용한다.

# Call로 나타낼 것을 클래스 단위로 불러온다.

# 유저의 억세스 토큰을 헤드로 넣을것이다.

# 사진파일은 MultipartBody.Part를 사용한다. (뒤의 photo는 키값이다.)

# 텍스트 형식으로는 키값을 문자열로 입력하고 괄호로 감싸며 그 후 RequestBody를 사용한다.

 

 

API를 만들었으면 엑티비티에서 이 API를 사용해보자.

 

저장 버튼을 눌렀을때 실행되도록 한다.

 

    btnSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(photoFile == null){
                Toast.makeText(AddActivity.this, "사진을 선택하세요", Toast.LENGTH_SHORT).show();
                return;
            }

            String content = editContent.getText().toString().trim();
            if(content.isEmpty()){
                Toast.makeText(AddActivity.this, "내용을 입력하세요", Toast.LENGTH_SHORT).show();
                return;
            }

            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);

            // 멀티파트로로 텍스트를 보내는경우 파라미터 보내는 방법
            RequestBody contentBody = RequestBody.create(content, MediaType.parse("text/plain"));

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

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

            showProgress("포스팅 하는중입니다.");

            call.enqueue(new Callback<PostRes>() {
                @Override
                public void onResponse(Call<PostRes> call, Response<PostRes> response) {
                    dismissProgress();
                    if(response.isSuccessful()){
                        Toast.makeText(AddActivity.this, "업로드가 완료되었습니다.", Toast.LENGTH_SHORT).show();
                        finish();
                    }else{

                    }
                }

                @Override
                public void onFailure(Call<PostRes> call, Throwable t) {
                    dismissProgress();
                }
            });

        }
    });
    
    imgPhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showDialog();
        }
    });
    
}

# 사진파일을 보내기위해 먼저 MultipartBody에 쓸 RequestBody (변수: fileBody)를 만든 후 MultipartBody (변수: photo)를 작성한다.

# RequestBody (변수: contentBody)를 사용하여 포스팅 할때의 글도 보내준다.

 

 

 

 

 

댓글