71 lines
2.3 KiB
Kotlin
71 lines
2.3 KiB
Kotlin
package dev.inmo.micro_utils.ktor.server
|
|
|
|
import dev.inmo.micro_utils.common.*
|
|
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
|
|
import io.ktor.utils.io.core.*
|
|
import kotlinx.coroutines.currentCoroutineContext
|
|
import kotlinx.coroutines.isActive
|
|
|
|
/**
|
|
* Server-side part which receives [dev.inmo.micro_utils.ktor.client.uniUpload] request
|
|
*/
|
|
suspend inline fun ApplicationCall.handleUniUpload(
|
|
onFormItem: (PartData.FormItem) -> Unit = {},
|
|
onBinaryContent: (PartData.BinaryItem) -> Unit = {},
|
|
onBinaryChannelItem: (PartData.BinaryChannelItem) -> Unit = {},
|
|
onFileItem: (PartData.FileItem) -> Unit = {}
|
|
) {
|
|
val multipartData = receiveMultipart()
|
|
|
|
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)
|
|
}
|
|
partData.dispose()
|
|
}
|
|
}
|
|
|
|
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,
|
|
onBinaryContent,
|
|
onBinaryChannelItem
|
|
) {
|
|
when (it.name) {
|
|
"bytes" -> resultInput = it.provider()
|
|
else -> onCustomFileItem(it)
|
|
}
|
|
}
|
|
|
|
resultInput ?: error("Bytes has not been received")
|
|
}
|
|
|
|
suspend fun ApplicationCall.uniloadMultipartFile(
|
|
onFormItem: (PartData.FormItem) -> Unit = {},
|
|
onCustomFileItem: (PartData.FileItem) -> Unit = {},
|
|
onBinaryChannelItem: (PartData.BinaryChannelItem) -> Unit = {},
|
|
onBinaryContent: (PartData.BinaryItem) -> Unit = {},
|
|
): MPPFile = safely {
|
|
uniloadMultipart(
|
|
onFormItem,
|
|
onCustomFileItem,
|
|
onBinaryChannelItem,
|
|
onBinaryContent
|
|
).downloadToTempFile()
|
|
}
|