본문 바로가기
🖥 Programming/📱 Android (Java)

[Android] WebView FileDownload시 .bin 파일확장자 버그 해결방법

by MinChan-Youn 2022. 7. 6.

안녕하세요~ 챠니입니다! :)

 

특정앱에서 파일을 다운로드하게 되면 파일 확장자가 ".bin"으로 다운로드되어 확인이 어렵다는 말을 듣게 되었습니다.

앱말고 네이버 앱, 크롬 등등에서 직접 다운받으면 확장자가 제대로 되어 다운이 된다고 확인 부탁한다는 말을 듣게 되었습니다.

 

 

딱 봐도 뭔가 느낌이 쎄하쥬??

네.. 아마 앱 코드쪽에서 문제일것으로 저도 판단됩니다.

그럼 어떻게 수정을 해야할지 알아보도록 하겠습니다.

 

 

    기존코드

    코드는 아래와 같습니다.

    setDownloadListener(new DownloadListener() {
                @Override
                public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
    
                    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
                    request.setMimeType(mimeType);
                    //------------------------COOKIE!!------------------------
                    String cookies = CookieManager.getInstance().getCookie(url);
                    request.addRequestHeader("cookie", cookies);
                    //------------------------COOKIE!!------------------------
                    request.addRequestHeader("User-Agent", userAgent);
                    request.setDescription("Downloading file...");
    
    				//=========== 여기 ===========
                    request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType));
                    request.allowScanningByMediaScanner();
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
                    
    				//=========== 여기 ===========
                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(url, contentDisposition, mimeType));
                    DownloadManager dm = getMyApplication().getDownLoadManager();
                    getMyApplication().addDownloadreference(dm.enqueue(request));
                    Toast.makeText(getApplicationContext(), "파일 다운로드 시작", Toast.LENGTH_LONG).show();
                    if (!canGoBack() && WEB_VIEW_TYPE == KApplication.WEBVIEW_TYPE_WINDOW_POP) {
                        loadUrl("javascript:self.close();");
                    }
                }

     

    다음과 같이 " //=========== 여기 ==========="로 표시해둔 부분에서 파일확장자가 제대로 설정이 되지 않아 ".bin"으로 다운이 되는 버그였습니다.

     

    보다더 자세하게 확인하고 싶은분들은 URLUtil.guessFileName쪽을 자세히 보시면 특별한 케이스가 아닐때에는 ".bin"으로 확장자가 처리되는 것을 알 수 있습니다.

     

     

     

     

     

     

     

    버그수정

    수정한 코드는 아래와 같습니다.

    상세 설명은 아래에서 설명하겠습니다.

    setDownloadListener(new DownloadListener() {
                @Override
                public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
    
                    // 파일명 잘라내기 및 확장자 확인
                    String fileName = contentDisposition;
                    if (fileName != null && fileName.length() > 0) {
                        int idxFileName = fileName.indexOf("filename=");
                        if (idxFileName > -1) {
                            fileName = fileName.substring(idxFileName + 9).trim();
                        }
                        if (fileName.endsWith(";")) {
                            fileName = fileName.substring(0, fileName.length() - 1);
                        }
                        if (fileName.startsWith("\"") && fileName.startsWith("\"")) {
                            fileName = fileName.substring(1, fileName.length() - 1);
                        }
                    }else{
                        // 파일명(확장자포함) 확인이 안되었을 때 기존방식으로 진행
                        fileName = URLUtil.guessFileName(url, contentDisposition, mimeType);
                    }
    
                    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
                    request.setMimeType(mimeType);
                    //------------------------COOKIE!!------------------------
                    String cookies = CookieManager.getInstance().getCookie(url);
                    request.addRequestHeader("cookie", cookies);
                    //------------------------COOKIE!!------------------------
                    request.addRequestHeader("User-Agent", userAgent);
                    request.setDescription("Downloading file...");
                    request.setTitle(fileName);
                    request.allowScanningByMediaScanner();
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
                    DownloadManager dm = getMyApplication().getDownLoadManager();
                    getMyApplication().addDownloadreference(dm.enqueue(request));
                    Toast.makeText(getApplicationContext(), "파일 다운로드 시작", Toast.LENGTH_LONG).show();
                    if (!canGoBack() && WEB_VIEW_TYPE == KApplication.WEBVIEW_TYPE_WINDOW_POP) {
                        loadUrl("javascript:self.close();");
                    }
                }

     

     

    우리가 자세히 봐야할 코드는 아래와 같습니다.

    // 파일명 잘라내기 및 확장자 확인
    String fileName = contentDisposition;
    if (fileName != null && fileName.length() > 0) {
        int idxFileName = fileName.indexOf("filename=");
        if (idxFileName > -1) {
            fileName = fileName.substring(idxFileName + 9).trim();
        }
        if (fileName.endsWith(";")) {
            fileName = fileName.substring(0, fileName.length() - 1);
        }
        if (fileName.startsWith("\"") && fileName.startsWith("\"")) {
            fileName = fileName.substring(1, fileName.length() - 1);
        }
    }else{
        // 파일명(확장자포함) 확인이 안되었을 때 기존방식으로 진행
        fileName = URLUtil.guessFileName(url, contentDisposition, mimeType);
    }

     

    실제로 파일명을 가져와서 확장자를 확인 및 추가하여 파일확장자만 가져오는 로직입니다.

    위의 로직을 추가하여 정확한 파일명과 확장자를 가지고 다운로드할 때 제대로 다운이 되는 것을 확인 할 수 있었습니다.

     

     

     

    -

    질문 또는 궁굼한 부분은 댓글을 남겨주세요! 친절하게 답변드리겠습니다!

    응원의 댓글은 저에게 큰 힘이 된답니다! :)

    즐거운 하루되세요!

     

    깃허브 보러 놀러오세요 👇 (맞팔환영)

    https://github.com/younminchan

     

    younminchan - Overview

    안드로이드 2년차 개발자 •⚽️/🎤/🥁/🖥/🏃‍♂️/🚴‍♂️/🤟 TechBlog⬇️ minchanyoun.tistory.com - younminchan

    github.com