안녕하세요 오늘은
0. 서론
파일이 손상됐을 때 다시 다운로드 받기 (File 데이터 클래스로) 임
일단 URL에서 파일을 다운로드 받는 로직에서
갑자기 BAD_DECRYPT
이런 오류가 나옴..
근데 솔직히 내가 비밀키를 뭐 바꾼것도아니고, 암호화-복호화, 해싱에 대해서 손댄것도 아니라서
킹리적 갓심으로 -> '파일 다운로드 받을 때 손상됐다.'
라는 생각이 듦.
GPT나 클라우드도 복호화가 안되는 것 파일이 손상됐거나, 읽어들일 수 없는 파일이 가장 큰 이유라는 설명.
1. 본론
일단 복호화할 때 이를 cache로 저장하는데
val tempFile = File.createTempFile("temp_", null, context.cacheDir)
connection.inputStream.use { input ->
tempFile.outputStream().use { output ->
input.copyTo(output)
}
}
정상적으로 복호화되면 PASS
정상적이지 않게 복호화가 되면 이를 감지해야함.
일단 나는 열거형 클래스로 json과 media로 나눴음
(1) 세팅
enum class FileType {
JSON, MEDIA
}
data class urlTuples(
val json_name: String,
val media_name: String,
)
url은 json과 media 고유 파일명이 있어서 따로 관리하고
내 프로젝트에 저장된 strings.xml의 url과 urlTuples의 2개의 string을 엔드포인트로 넣어서 시작.
결론적으로 getFile()이라는 파일 함수를 가져와서
해당 File데이터 형식의 변수에 있는 canRead()를 통해
이 파일을 읽을 수 있는지 읽을 수 없는지 에 대해서 알 수 있음
그래서 손상된 파일이라면
(2) 로직 순서
1) 삭제하기
2) 다시 다운로드 받기
3) 만약만약, 이 파일도 실패했을 경우 다시 삭제해서 다운로드
4) 여기서 3번 try후 실패 시, 다운로드 실패에 대한 UI 구현.
순서인데 아무튼 여기서는 3, 4는 없음 ㅋㅋ
var jsonFile = getFile(context, uriTuples[i].json_name)
var mediaFile = getFile(context, uriTuples[i].media_name)
// 파일 중 손상된 경우 삭제 후 재 다운로드 로직
if (jsonFile == null || mediaFile == null || !jsonFile.canRead() || !mediaFile.canRead()) {
// 손상된 파일 삭제
deleteCorruptedFile(context, uriTuples[i].json_name)
deleteCorruptedFile(context, uriTuples[i].media_name)
// 파일 재다운로드
val jsonDownloaded = saveFileFromUrl(
context,
uriTuples[i].json_name,
FileType.JSON
)
val mediaDownloaded = saveFileFromUrl(
context,
uriTuples[i].media_name,
FileType.MEDIA
)
// 새로 다운로드한 파일 가져오기
jsonFile = if (jsonDownloaded) getFile(context, uriTuples[i].json_name) else null
mediaFile = if (mediaDownloaded) getFile(context, uriTuples[i].media_name) else null
}
이렇게 다운로드 받고 다시 가져오기
2. 테스트
만약에 파일이 잘 저장되는 상황에서 이를 구현하고 테스트 하고싶다.
그러면 이렇게 일부러 올바르지 않은 파일을 손상된 데이터로 저장.
// 손상된 데이터로 저장
if (fileName.contains("4-2-1737451356.json")) {
Log.v("SaveFileFromUrl", "Intentionally corrupting file: $fileName")
val corruptedData = "THIS IS CORRUPTED DATA".toByteArray()
tempFile.writeBytes(corruptedData)
}
// tempFile을 사용할 곳으로 저장하는 로직 들어가는 곳 (내외부 저장소)
tempFile.delete()
Log.v("SaveFileFromUrl", "Success To Save File : ${file.absolutePath}")
이러면
요 로그가 또 나온다는 사실 ^^
아무튼 또 하나 알아갑니다
'개발 > android_kotlin' 카테고리의 다른 글
kotlin OKHttp3 토큰 자동 갱신 요청 (0) | 2025.01.31 |
---|---|
kotlin Error occurred while mirroring video: ffmpeg version v4.5-dev-2008-g90da43557f / FFMpeg 안드로이드 동영상 좌우 반전처리 (0) | 2025.01.30 |
kotlin 안드로이드 unit test, test 사용하기 (1) | 2025.01.28 |
kotlin 화면전환시 캐시파일 사라짐 (cache에 넣은 .tmp 자동삭제 ) (1) | 2025.01.27 |
kotlin 네트워크 형식, 보안 체크 하기 (1) | 2024.12.31 |