Robin T
03/12/2024, 8:33 AMwhen (val fileItem = call.receiveMultipart().readAllParts().single()) {
is PartData.FileItem -> {
fileItem.provider().use {
it.readByte()
}
}
else -> error("")
}
But it.readByte()
is returning -1.
Also, it.canRead()
is returning false.
However, if I first call it.tryPeek()
then I am able to call readBytes. and it.canRead()
is returning true again.
Does this have something to do with the chunkbuffer-pool not being setup for read yet?Aleksei Tirman [JB]
03/12/2024, 8:33 AMRobin T
03/12/2024, 8:34 AMRobin T
03/12/2024, 8:37 AMAleksei Tirman [JB]
03/12/2024, 8:39 AMRobin T
03/12/2024, 8:40 AMclient.submitFormWithBinaryData(
"/mellomlagring/fil",
formData {
append("document", Resource.read("/resources/images/bilde.jpg"),
Headers.build {
append(HttpHeaders.ContentDisposition, "filename=bilde.jpg")
append(HttpHeaders.ContentType, "image/jpeg")
})
},
)
Aleksei Tirman [JB]
03/12/2024, 8:41 AMRobin T
03/12/2024, 9:09 AMfun main() {
embeddedServer(Netty, port = 8080, module = {
install(ContentNegotiation) { jackson {} }
routing {
post("/byte") {
when (val fileItem = call.receiveMultipart().readAllParts().single()) {
is PartData.FileItem -> {
fileItem.provider().use {
// it.tryPeek() // uncomment to read byte
when (it.canRead()) {
true -> call.respond(it.readByte())
false -> call.respond(HttpStatusCode.UnprocessableEntity, "cant read stream")
}
}
}
else -> call.respond(HttpStatusCode.BadRequest, "File not found")
}
}
}
}).start(wait = true)
}
Intellij HTTP client:
POST <http://0.0.0.0:8080/byte>
Content-Type: multipart/form-data; boundary=boundary
--boundary
Content-Disposition: form-data; name="document"; filename="bilde.jpg"
< ./bilde.jpg
Setup:
JDK 21
ktor 2.3.9
Kotlin 1.9.23
dependencies {
implementation("io.ktor:ktor-server-core:$ktorVersion")
implementation("io.ktor:ktor-server-netty:$ktorVersion")
implementation("io.ktor:ktor-server-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-jackson:$ktorVersion")
}
Robin T
03/12/2024, 9:26 AM.jpg
starts with -1
Example:
object Resource {
fun read(path: String): ByteArray = requireNotNull(this::class.java.getResource(path)).readBytes()
}
Resource.read("/resources/images/Cat03.jpg") # first byte is -1
Ref: https://en.m.wikipedia.org/wiki/File:Cat03.jpg▾
Robin T
03/12/2024, 9:29 AM