안녕하세요 오늘은

 

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}")

이러면 

요 로그가 또 나온다는 사실 ^^ 

 

아무튼 또 하나 알아갑니다 

이미지 손상된File 썸네일