Notice
Recent Posts
Recent Comments
Link
투케이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;
}
}
반응형
'Android' 카테고리의 다른 글
Comments