aboutsummaryrefslogtreecommitdiff
path: root/app/bin/main/xyz/brysonsteck/serverfordummies/downloadFile.kt
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/main/xyz/brysonsteck/serverfordummies/downloadFile.kt')
-rw-r--r--app/bin/main/xyz/brysonsteck/serverfordummies/downloadFile.kt37
1 files changed, 37 insertions, 0 deletions
diff --git a/app/bin/main/xyz/brysonsteck/serverfordummies/downloadFile.kt b/app/bin/main/xyz/brysonsteck/serverfordummies/downloadFile.kt
new file mode 100644
index 0000000..bbaeab5
--- /dev/null
+++ b/app/bin/main/xyz/brysonsteck/serverfordummies/downloadFile.kt
@@ -0,0 +1,37 @@
+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"))
+ }
+ }
+} \ No newline at end of file