MicroUtils/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/UniloadMultipart.kt

71 lines
2.3 KiB
Kotlin
Raw Normal View History

2020-09-22 02:20:22 +00:00
package dev.inmo.micro_utils.ktor.server
2021-12-14 12:01:41 +00:00
import dev.inmo.micro_utils.common.*
2020-09-26 15:42:05 +00:00
import dev.inmo.micro_utils.coroutines.safely
import dev.inmo.micro_utils.ktor.common.downloadToTempFile
import io.ktor.http.content.*
import io.ktor.server.application.ApplicationCall
import io.ktor.server.request.receiveMultipart
2022-04-27 12:24:51 +00:00
import io.ktor.utils.io.core.*
2022-11-24 06:29:48 +00:00
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.isActive
2020-11-27 08:35:00 +00:00
/**
* Server-side part which receives [dev.inmo.micro_utils.ktor.client.uniUpload] request
*/
2022-11-24 06:29:48 +00:00
suspend inline fun ApplicationCall.handleUniUpload(
2021-12-14 12:01:41 +00:00
onFormItem: (PartData.FormItem) -> Unit = {},
2022-11-24 06:29:48 +00:00
onBinaryContent: (PartData.BinaryItem) -> Unit = {},
2022-08-04 03:59:05 +00:00
onBinaryChannelItem: (PartData.BinaryChannelItem) -> Unit = {},
2022-11-24 06:29:48 +00:00
onFileItem: (PartData.FileItem) -> Unit = {}
) {
2021-12-14 12:01:41 +00:00
val multipartData = receiveMultipart()
2022-11-24 06:29:48 +00:00
while (currentCoroutineContext().isActive) {
val partData = multipartData.readPart() ?: break
when (partData) {
is PartData.FormItem -> onFormItem(partData)
is PartData.FileItem -> onFileItem(partData)
is PartData.BinaryItem -> onBinaryContent(partData)
is PartData.BinaryChannelItem -> onBinaryChannelItem(partData)
2021-12-14 12:01:41 +00:00
}
2022-11-25 04:15:59 +00:00
partData.dispose()
2021-12-14 12:01:41 +00:00
}
}
suspend fun ApplicationCall.uniloadMultipart(
onFormItem: (PartData.FormItem) -> Unit = {},
onCustomFileItem: (PartData.FileItem) -> Unit = {},
onBinaryChannelItem: (PartData.BinaryChannelItem) -> Unit = {},
onBinaryContent: (PartData.BinaryItem) -> Unit = {}
): Input = safely {
var resultInput: Input? = null
handleUniUpload(
onFormItem,
2022-11-24 06:29:48 +00:00
onBinaryContent,
onBinaryChannelItem
) {
when (it.name) {
"bytes" -> resultInput = it.provider()
else -> onCustomFileItem(it)
}
}
2021-12-14 12:01:41 +00:00
resultInput ?: error("Bytes has not been received")
}
suspend fun ApplicationCall.uniloadMultipartFile(
onFormItem: (PartData.FormItem) -> Unit = {},
onCustomFileItem: (PartData.FileItem) -> Unit = {},
2022-08-04 03:59:05 +00:00
onBinaryChannelItem: (PartData.BinaryChannelItem) -> Unit = {},
2021-12-14 12:01:41 +00:00
onBinaryContent: (PartData.BinaryItem) -> Unit = {},
): MPPFile = safely {
uniloadMultipart(
onFormItem,
onCustomFileItem,
onBinaryChannelItem,
onBinaryContent
).downloadToTempFile()
2021-12-14 12:01:41 +00:00
}