Notice
Recent Posts
Recent Comments
Link
투케이2K
672. (Android/Java) [유틸 파일] requestGetAsyncFileExtensionHttp : okhttp 사용해 파일 다운로드 및 외부 저장소에 파일 저장 수행 본문
Android
672. (Android/Java) [유틸 파일] requestGetAsyncFileExtensionHttp : okhttp 사용해 파일 다운로드 및 외부 저장소에 파일 저장 수행
투케이2K 2023. 10. 24. 15:34[개발 환경 설정]
개발 툴 : AndroidStudio
[소스 코드]
// -----------------------------------------------------------------------------------------
// TODO [SEARCH FAST] : [GET] : [File] : [HTTP] : requestGetAsyncFileExtensionHttp
// -----------------------------------------------------------------------------------------
// TODO [호출 방법 소스 코드]
// -----------------------------------------------------------------------------------------
// TODO [참고 및 로직 동작] :
// TODO [1] : URL 주소에 파일 확장자 명이 포함된 도메인 호출
// TODO [2] : HTTP 파일 다운로드
// TODO [3] : 다운로드 폴더 (외부 저장소) 에 해당 파일 저장 실시 (매니저 권한 퍼미션 필요)
// TODO <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
// -----------------------------------------------------------------------------------------
/*
try {
// [URL 주소 선언]
String url = "https://test-apk-bucket.s3.ap-northeast-1.amazonaws.com/update_test.apk";
// [헤더 선언]
Map<String, Object> header = new HashMap<>();
// [저장할 파일 경로]
String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + "/LOG_SAVE_FOLDER/";
// [저장 할 파일 명칭 지정]
String fileName = "twok.apk";
// [http 요청 수행]
N_AsyncHttp.requestGetAsyncFileExtensionHttp(A_Webview.this, "파일 다운로드 요청", url, header, filePath, fileName) // [http 요청]
.subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
.observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
.subscribe(new Observer<Boolean>() { // [Observable.create 타입 지정]
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Boolean value) {
S_Log._W_("파일 다운 로드 결과 :: " + String.valueOf(value), null);
}
@Override
public void onError(@NonNull Throwable e) {
S_Log._W_("파일 다운 로드 결과 :: onError :: " + String.valueOf(e.getMessage()), null);
}
@Override
public void onComplete() {
}
});
}
catch (Exception e){
S_Log._printStackTrace_(null, S_FinalMsg.LOG_BUG_STATE, null, e);
}
// */
// -----------------------------------------------------------------------------------------
public static Observable<Boolean> requestGetAsyncFileExtensionHttp(Context mContext, String tag, String url, Map header, String savePath, String saveName){
// [로직 처리 실시]
return Observable.create(subscriber -> {
try {
// ------------------------------------------------------
// TODO [URL 변수 선언 실시]
// ------------------------------------------------------
String urlData = String.valueOf(url);
if (C_Util.stringNotNull(urlData) == false) {
S_Log._F_(mContext, "requestGetAsyncFileExtensionHttp :: [Error] :: URL Data Is Null", null);
subscriber.onNext(false);
subscriber.onComplete();
return;
}
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [파일 확장자 포함 체크 실시]
// ------------------------------------------------------
if (C_Util.stringNotNull(C_Util.urlFileExtensionName(urlData)) == false) {
S_Log._F_(mContext, "requestGetAsyncFileExtensionHttp :: [Error] :: File Extension Is Null", null);
subscriber.onNext(false);
subscriber.onComplete();
return;
}
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [저장 파일 경로 널 체크]
// ------------------------------------------------------
if (C_Util.stringNotNull(savePath) == false) {
S_Log._F_(mContext, "requestGetAsyncFileExtensionHttp :: [Error] :: File Save Path Is Null", null);
subscriber.onNext(false);
subscriber.onComplete();
return;
}
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [저장 파일 경로 존재 여부 체크]
// ------------------------------------------------------
File file = new File(savePath);
if (file.exists() == false){ // [파일 경로 존재 하지 않음]
S_Log._F_(mContext, "requestGetAsyncFileExtensionHttp :: [Error] :: File Save Path Not Exists", null);
subscriber.onNext(false);
subscriber.onComplete();
return;
}
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [외부 저장소 저장 권한 확인] : 안드로이드 11 미만 (10 이하) 이고, 외부 저장소 저장 권한이 없는 경우
// ------------------------------------------------------
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R || Environment.isExternalStorageManager() == false) {
S_Log._F_(mContext, "requestGetAsyncFileExtensionHttp :: [Error] :: File Save Permission Or Android Os Version Issue", null);
subscriber.onNext(false);
subscriber.onComplete();
return;
}
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [저장 파일 명칭 널 체크]
// ------------------------------------------------------
if (C_Util.stringNotNull(saveName) == false) {
S_Log._F_(mContext, "requestGetAsyncFileExtensionHttp :: [Error] :: File Save Name Is Null", null);
subscriber.onNext(false);
subscriber.onComplete();
return;
}
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [파일 다운 로드 수행]
// ------------------------------------------------------
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(TIME_OUT_SECOND, TimeUnit.SECONDS) // [커넥션 제한 시간]
.readTimeout(TIME_OUT_SECOND, TimeUnit.SECONDS) // [파일 읽기]
//.writeTimeout(TIME_OUT_SECOND, TimeUnit.SECONDS)
.retryOnConnectionFailure(false)
.build();
Request.Builder request = new Request.Builder();
request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8;"); //TODO [헤더]
request.addHeader("Cache-Control", "no-cache"); //TODO [헤더]
if (C_Util.mapNotNull(header) == true){
Set set = header.keySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()){
String key = (String) iterator.next();
request.addHeader(key, String.valueOf(header.get(key))); //TODO [헤더 추가]
}
}
HttpUrl.Builder httpBuilder = HttpUrl.get(URI.create(urlData)).newBuilder();
request.url(httpBuilder.build()); //TODO [httpBuilder 추가]
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [요청 로그 출력 실시]
// ------------------------------------------------------
S_Log._F_(mContext, "requestGetAsyncFileExtensionHttp :: OK HTTP 비동기 GET 파일 다운 로드 [요청] 실시", new String[]{
"TAG :: " + String.valueOf(tag),
"URL :: " + String.valueOf(urlData),
"HEADER :: " + String.valueOf(header),
"SAVE PATH :: " + String.valueOf(savePath),
"SAVE NAME :: " + String.valueOf(saveName)
});
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [비동기 처리 (enqueue 사용)]
// ------------------------------------------------------
String finalUrlData = urlData;
client.newCall(request.build()).enqueue(new Callback() {
// TODO [성공한 경우]
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseUrl = String.valueOf(finalUrlData);
final String responseHeader = String.valueOf(response.headers().toString());
final String responseCode = String.valueOf(response.code());
final String responseContentType = String.valueOf(response.body().contentType());
final String responseSize = String.valueOf(response.body().contentLength());
// ------------------------------------------------------
// [로그 출력]
// ------------------------------------------------------
S_Log._F_(mContext, "requestGetAsyncFileExtensionHttp :: OK HTTP 비동기 GET 파일 다운 로드 [응답] 확인", new String[] {
"TAG :: " + String.valueOf(tag),
"TYPE :: " + "GET >> RESPONSE",
"CODE :: " + String.valueOf(responseCode),
"URL :: " + String.valueOf(responseUrl),
"HEADER :: " + String.valueOf(responseHeader),
"CONTENT TYPE :: " + String.valueOf(responseContentType),
"FILE SIZE :: " + String.valueOf(responseSize)
});
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [응답 코드 값 체크 및 리턴 데이터 반환]
// ------------------------------------------------------
try {
int statusCode = response.code();
if (statusCode >= 200 && statusCode < 300){ // TODO [정상 응답]
// TODO [다운 로드 경로에 파일 저장 실시]
String saveFile = savePath;
if (savePath.endsWith("/") == true){
saveFile = saveFile + saveName;
}
else {
saveFile = saveFile + "/" + saveName;
}
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(saveFile));
bos.write(response.body().bytes()); // 파일 쓰기 및 저장
bos.close(); // 출력 및 저장 객체 사용을 다 한 경우는 close 처리
// TODO [결과 반환]
subscriber.onNext(true);
subscriber.onComplete();
}
else { // TODO [에러 응답]
subscriber.onError(new Throwable("[ERROR] : : [requestGetAsyncFileExtensionHttp] : " + C_ErrorCheck.getErrorHttpMsg(responseCode)));
}
}
catch (Exception e){
S_Log._printStackTrace_(mContext, S_FinalMsg.LOG_BUG_STATE, null, e);
subscriber.onError(new Throwable("[EXCEPTION] : [1] : [requestGetAsyncFileExtensionHttp] : " + e.getMessage()));
}
// ------------------------------------------------------
}
//TODO [실패한 경우]
@Override
public void onFailure(Call call, IOException e) {
final String responseUrl = String.valueOf(finalUrlData);
final String responseError = String.valueOf(e.getMessage());
// ------------------------------------------------------
// [로그 출력]
// ------------------------------------------------------
S_Log._F_(mContext, "requestGetAsyncFileExtensionHttp :: OK HTTP 비동기 GET 파일 다운 로드 [에러] 확인", new String[] {
"TAG :: " + String.valueOf(tag),
"TYPE :: " + "GET >> FAIL",
"URL :: " + String.valueOf(responseUrl),
"DATA :: " + String.valueOf(responseError)
});
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [리턴 데이터 반환]
// ------------------------------------------------------
try {
subscriber.onError(new Throwable("[FAIL] : [requestGetAsyncFileExtensionHttp] : " + responseError));
}
catch (Exception ex){
ex.printStackTrace();
}
// ------------------------------------------------------
}
});
} catch (final Exception e){
// ------------------------------------------------------
// [로그 출력]
// ------------------------------------------------------
S_Log._printStackTrace_(mContext, S_FinalMsg.LOG_BUG_STATE, new String[] {
"requestGetAsyncFileExtensionHttp :: OK HTTP 비동기 GET 파일 다운 로드 [EXCEPTION] 확인",
"TAG :: " + String.valueOf(tag),
"TYPE :: " + "GET >> EXCEPTION",
"EXCEPTION :: " + String.valueOf(e.getMessage())
}, e);
// ------------------------------------------------------
// ------------------------------------------------------
// TODO [리턴 데이터 반환]
// ------------------------------------------------------
try {
subscriber.onError(new Throwable("[EXCEPTION] : [requestGetAsyncFileExtensionHttp] : " + String.valueOf(e.getMessage())));
}
catch (Exception ex){
ex.printStackTrace();
}
// ------------------------------------------------------
}
});
}
반응형
'Android' 카테고리의 다른 글
Comments