ServerCraft/app/bin/main/xyz/brysonsteck/serverfordummies/downloadFile.kt

37 lines
No EOL
1.2 KiB
Kotlin

import java.net.http.HttpClient
import kotlinx.coroutines.flow
sealed class DownloadStatus {
object Success : DownloadStatus()
data class Error(val message: String) : DownloadStatus()
data class Progress(val progress: Int): DownloadStatus()
}
// function from https://gist.githubusercontent.com/SG-K/63e379efcc3d1cd3ce4fb56ee0e29c42/raw/cd9a4a016401b7c54ec01303415b5871ffa26066/downloadFile.kt
suspend fun HttpClient.downloadFile(file: File, url: String): Flow<DownloadStatus> {
return flow {
val response = call {
url(url)
method = HttpMethod.Get
}.response
val byteArray = ByteArray(response.contentLength()!!.toInt())
var offset = 0
do {
val currentRead = response.content.readAvailable(byteArray, offset, byteArray.size)
offset += currentRead
val progress = (offset * 100f / byteArray.size).roundToInt()
emit(DownloadStatus.Progress(progress))
} while (currentRead > 0)
response.close()
if (response.status.isSuccess()) {
file.writeBytes(byteArray)
emit(DownloadStatus.Success)
} else {
emit(DownloadStatus.Error("File not downloaded"))
}
}
}