본문 바로가기
개발자 도전기

[안드로이드] Volley로 여러 개 파일 보낼 때 (Multipart Request)

by 개발하는아빠 2022. 9. 21.

1. 웹브라우저 <-> 웹브라우저 간 파일 전송

2. 안드로이드에서 OkHttp를 사용하여 서버로 파일 전송

위 두 절차를 진행하면서, 파일 형태의 데이터를 서버로 전송하기 위해서는 Multipart가 필요하다고 이해했습니다.

Volley에서도 Multipart를 보낼 방법이 있으리라 생각했습니다.

인도네시아 개발자가 본인 깃허브에 업로드한 방법을 따라해서, 실제 동작함을 확인했습니다.

방식은 아래와 같습니다.

1. VolleyMultipartRequest.java 클래스를 생성합니다.

2. VolleySingeton.java 클래스를 생성합니다.

MainActivity에서 위 두 가지 클래스를 사용하여 서버에 요청을 보내게 됩니다.

Volley 공식문서를 보면, 2.VolleySingeton 사용 방법 코드가 그대로 있어서 위 개발자도 해당 내용을 참고한 것으로 생각됩니다. 그러나 1. VolleyMultipartRequest는 누가 최초로 만들었는지 아직 확인하지 못했습니다.

일단, 전체 구조가 어떻게 생겼는지 이해하면서 해당 내용을 구현해봤습니다.

 

      String url = "http://3.38.178.28/httpPractice/testVolley.php";

        VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(com.android.volley.Request.Method.POST, url,
                new com.android.volley.Response.Listener<NetworkResponse>() {
            @Override
            public void onResponse(NetworkResponse response) {
                Log.i(TAG, "onResponse = " + String.valueOf(response));
                String resultResponse = new String(response.data);
                Log.i(TAG, "resultResponse = " + resultResponse);
                Log.i(TAG, "response.data = " + response.data);
                Log.i(TAG, "response.data.toString() = " + response.data.toString());

                // parse success output
            }
        }, new com.android.volley.Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        }) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<>();
                params.put("about", "UI/UX Designer");
                params.put("contact", "angga@email.com");
                params.put("fileCount", String.valueOf(byteArrayList.size()));
                return params;
            }

            @Override
            protected Map<String, DataPart> getByteData() {
                Map<String, DataPart> params = new HashMap<>();
                // file name could found file base or direct access from real path
                // for now just get bitmap data from ImageView

                //byteArrayOutputStream.toByteArray();
                for (int i = 0; i < byteArrayList.size(); i++) {
                    params.put("imageName"+i, new DataPart("("+i+")"+".jpg", byteArrayList.get(i), "image/jpg"));
                }

//                params.put("cover", new DataPart("file_cover.jpg", AppHelper.getFileDataFromDrawable(getBaseContext(), mCoverImage.getDrawable()), "image/jpeg"));

                return params;
            }
        };

        VolleySingleton.getInstance(getBaseContext()).addToRequestQueue(multipartRequest);

 

Volley를 사용하여 값을 전달하는 방식과 거의 유사합니다. 일반적으로 StringRequest 객체를 만들어 서버에 전송하는 것과 같이 여기에서는 VolleyMultiPartRequest 객체를 만듭니다. @Override에 protected Map<String, DataPart>가 있습니다. 여기에 데이터를 추가하면 됩니다. new DataPart를 선언할 때 VolleyMultiPartRequest.java 파일을 참고해야 합니다.

VolleySingleton을 사용하여 RequestQueue에 추가하면 정상적으로 동작합니다.

자세한 설명을 쓰자니, 제가 모르는 내용이 너무 많고... 아무것도 기록하지 말자니 제가 금방 잊을 것 같아서 아는 만큼만 일당 정리해봤습니다.

참고자료

https://github.com/Ankit7791/Android-Volley-Multipart-Request/blob/master/README.md

 

GitHub - Ankit7791/Android-Volley-Multipart-Request: Android Multiple Images upload Class

Android Multiple Images upload Class. Contribute to Ankit7791/Android-Volley-Multipart-Request development by creating an account on GitHub.

github.com

https://demonuts.com/upload-image-to-server-in-android-using-multipart-volley/

 

Upload Image To Server In Android Using Multipart Volley

upload image to server in android using multipart volley. upload multipart file upload using volley in android volley multipart request example

demonuts.com