안녕하세요~ 챠니입니다! :)
특정앱에서 파일을 다운로드하게 되면 파일 확장자가 ".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
'🖥 Programming > 📱 Android (Java)' 카테고리의 다른 글
[Android] APK파일 생성시 Execution failed for task ':app:lintVitalRelease'. 오류 (2) | 2021.10.22 |
---|---|
[Android] TabLayout(탭 레이아웃) Tab 1개 VISIBLE / GONE 처리 (0) | 2021.10.18 |
[Android] 토스트 메시지(Toast Message) 중복 생성 방지 (0) | 2021.10.14 |
[Android] TabLayout에서 tabRippleColor 설정방법 (탭 클릭 색상) (0) | 2021.10.07 |
[Android] TabLayout에 Viewpager연결하기 (0) | 2021.10.05 |
[Android] Dialog Method 정리 (0) | 2021.09.28 |
[android] Task 'assembleDebug' not found in project ':app'. 문제해결 (0) | 2021.09.27 |
[Android] Dialog 외부 터치 금지 (바깥 터치 금지) (0) | 2021.09.16 |