투케이2K

319. (AndroidStudio/android/java) okhttp 사용해 get 방식 파일 다운로드 및 response header Content-Disposition 확인 본문

Android

319. (AndroidStudio/android/java) okhttp 사용해 get 방식 파일 다운로드 및 response header Content-Disposition 확인

투케이2K 2022. 8. 12. 12:34

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : java

 

[소스 코드]

    // TODO [파일 다운로드 수행]
    public void download(String _url){
        try {

            /**
             * // -----------------------------------------
             * [okhttp 사용해 get 방식 파일 다운로드 수행 실시]
             * // -----------------------------------------
             * okhttp 라이브러리 버전 : implementation 'com.squareup.okhttp3:okhttp:3.10.0'
             * // -----------------------------------------
             * 호출 방법 : download("https://dev-test.admin.co.kr:6091/test/getFile/999/2");
             * // -----------------------------------------
             * */


            // [전송 url 정의 실시]
            String url = _url;


            // [OK HTTP 객체 선언 실시]
            //OkHttpClient client = new OkHttpClient();

            OkHttpClient client = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS) // [커넥션 제한 시간]
                    //.readTimeout(5, TimeUnit.SECONDS)
                    //.writeTimeout(5, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(false)
                    .build();

            Request.Builder request = new Request.Builder();
            HttpUrl.Builder httpBuilder = HttpUrl.get(URI.create(url)).newBuilder();
            request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8;"); // [헤더]


            // [httpBuilder 추가]
            request.url(httpBuilder.build());


            Log.i("---","---");
            Log.w("//===========//","================================================");
            Log.i("","\n"+"[C_SubmitDownloadFile >> download() :: OK HTTP 파일 다운로드 요청 실시]");
            Log.i("","\n"+"["+"요청 주소 :: " + String.valueOf(url)+"]");
            Log.w("//===========//","================================================");
            Log.i("---","---");


            // [비동기 처리 (enqueue 사용)]
            client.newCall(request.build()).enqueue(new Callback() {
                //TODO [성공한 경우]
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    try {
                        final String responseCode = String.valueOf(response.toString());
                        final String responseData = response.body().string();
                        final String responseFileName = String.valueOf(response.header("Content-Disposition"));
                        final String responseDataLen = String.valueOf(response.header("Content-Length"));
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"[C_SubmitDownloadFile >> download() :: OK HTTP 파일 다운로드 요청 성공]");
                        Log.i("","\n"+"["+"응답 코드 :: " + String.valueOf(responseCode)+"]");
                        //Log.i("","\n"+"["+"응답 값 :: " + String.valueOf(responseData)+"]");
                        Log.i("","\n"+"["+"응답 헤더 값 :: " + String.valueOf(response.headers().toString())+"]");
                        Log.i("","\n"+"["+"데이터 길이 :: " + String.valueOf(responseDataLen)+"]");
                        Log.i("","\n"+"["+"원본 파일 명칭 :: " + String.valueOf(responseFileName)+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");

                        // TODO [Content-Disposition 널 체크 수행 실시]
                        if (C_Util.stringNotNull(responseFileName) == true){
                        }
                        else {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"[C_SubmitDownloadFile >> download() :: OK HTTP 파일 다운로드 에러]");
                            Log.i("","\n"+"["+"error :: " + String.valueOf("response header Content-Disposition is null")+"]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");
                            return;
                        }


                        // TODO [response header filename 포함 확인]
                        if (responseFileName.contains("filename=") == true){
                        }
                        else {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"[C_SubmitDownloadFile >> download() :: OK HTTP 파일 다운로드 에러]");
                            Log.i("","\n"+"["+"error :: " + String.valueOf("Content-Disposition filename is null")+"]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");
                            return;
                        }


                        // TODO [파일 확장자가 포함 된 것 인지 확인]
                        if (responseFileName.contains(".") == true){
                        }
                        else {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"[C_SubmitDownloadFile >> download() :: OK HTTP 파일 다운로드 에러]");
                            Log.i("","\n"+"["+"error :: " + String.valueOf("file extensions is null [1]")+"]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");
                            return;
                        }


                        // TODO [데이터 파싱 수행 실시]
                        String fileName = String.valueOf(responseFileName);
                        fileName = fileName.replaceAll(" ", "");

                        String arrayData[] = fileName.split(";"); // [attachment;filename="test.jpg"]

                        if (arrayData != null && arrayData.length>0){
                            for (int i=0; i<arrayData.length; i++){
                                String parseString = String.valueOf(arrayData[i]);

                                if (parseString.contains("filename=") == true){ // [filename="test.jpg"]
                                    fileName = parseString.replaceAll("filename=", ""); // ["test.jpg"]

                                    // [URL 디코딩 수행]
                                    fileName = URLDecoder.decode(fileName, "UTF-8");
                                }
                            }
                        }
                        else {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"[C_SubmitDownloadFile >> download() :: OK HTTP 파일 다운로드 에러]");
                            Log.i("","\n"+"["+"error :: " + String.valueOf("array data parsing size is null")+"]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");
                            return;
                        }

                        if (fileName.startsWith("\"")){
                            fileName = fileName.substring(1, fileName.length()-1);
                        }
                        if (fileName.endsWith("\"")){
                            fileName = fileName.substring(0, fileName.length()-2);
                        }
                        fileName = fileName.trim();



                        // TODO [파일 확장자 명 검사 실시]
                        String extension = ""; // [jpg]
                        int strLength = fileName.lastIndexOf(".");
                        if (strLength > 0){
                            extension = fileName.substring(strLength + 1).toLowerCase();
                        }


                        // TODO [외부 공용 익스터널 저장 경로]
                        File pathFoler = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
                        String downloadPath = pathFoler.getPath();

                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"[C_SubmitDownloadFile >> download() :: 파일 다운로드 확장자 포맷 실시]");
                        Log.i("","\n"+"["+"파일 명칭 :: " + String.valueOf(fileName)+"]");
                        Log.i("","\n"+"["+"파일 확장자 :: " + String.valueOf(extension)+"]");
                        Log.i("","\n"+"["+"저장 경로 :: " + String.valueOf(downloadPath)+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");


                        if (C_Util.stringNotNull(extension) == true){ // [파일 확장자가 널이 아닌 경우]
                            Log.i("---","---");
                            Log.w("//===========//","================================================");
                            Log.i("","\n"+"[C_SubmitDownloadFile >> download() :: [정상] 파일 다운로드 수행 실시]");
                            Log.w("//===========//","================================================");
                            Log.i("---","---");

                            // TODO [DownloadManager 사용해 파일 다운로드 수행 실시]
                            DownloadManager manager = (DownloadManager) mContext.getSystemService(Activity.DOWNLOAD_SERVICE);
                            Uri uri = Uri.parse(url.trim()); // [파일 다운로드 주소 : 확장자명 포함되어야함]
                            DownloadManager.Request request = new DownloadManager.Request(uri); // [다운로드 매니저 객체 생성]
                            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // [앱 상단에 다운로드 표시]
                            request.setDescription("Download ... "); // [다운로드 중 표시되는 내용]
                            request.setNotificationVisibility(1); // [앱 상단에 다운로드 상태 표시]
                            try {
                                //*
                                request.setTitle(fileName); // [다운로드 제목 표시]
                                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); // [다운로드 폴더 지정]
                                manager.enqueue(request); // [다운로드 수행]
                                // */
                                return;
                            }
                            catch (Exception e){
                                //e.printStackTrace();

                                // TODO [파일 명칭 관련 에러가 발생한 경우 >> 현재 날짜 및 시간으로 포맷 수행 실시]
                                try {
                                    // [현재 날짜 및 시간 확인 실시]
                                    long time = System.currentTimeMillis();
                                    SimpleDateFormat dayTime = new SimpleDateFormat("yyyyMMddkkmmss");
                                    String str = dayTime.format(new Date(time));


                                    // [현재 날짜 및 시간 데이터 + 확장자명 결합 실시]
                                    String newFileName = str.trim() + "." + extension.trim();


                                    //*
                                    request.setTitle(newFileName); // [다운로드 제목 표시]
                                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, newFileName); // [다운로드 폴더 지정]
                                    manager.enqueue(request); // [다운로드 수행]
                                    // */
                                    return;
                                }
                                catch (Exception ex){
                                    ex.printStackTrace();
                                    return;
                                }
                            }
                        }
                        else {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"[C_SubmitDownloadFile >> download() :: [에러] 파일 다운로드 수행 실패]");
                            Log.i("","\n"+"["+"error :: " + String.valueOf("file extension is null [2]")+"]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");
                            return;
                        }
                    }
                    catch (Exception e){
                        e.printStackTrace();
                        return;
                    }
                }
                //TODO [실패한 경우]
                @Override
                public void onFailure(Call call, IOException e) {
                    try {
                        final String responseCode = String.valueOf(e.toString());
                        final String responseData = String.valueOf(e.getMessage());
                        Log.i("---","---");
                        Log.e("//===========//","================================================");
                        Log.i("","\n"+"[C_SubmitDownloadFile >> download() :: OK HTTP 파일 다운로드 요청 실패]");
                        Log.i("","\n"+"["+"에러 코드 :: " + String.valueOf(responseCode)+"]");
                        Log.i("","\n"+"["+"에러 값 :: " + String.valueOf(responseData)+"]");
                        Log.e("//===========//","================================================");
                        Log.i("---","---");
                        return;
                    }
                    catch (Exception ex){
                        e.printStackTrace();
                        return;
                    }
                }
            });
        } catch (final Exception e){
            e.printStackTrace();
            return;
        }
    }

 

반응형
Comments