Ich versuche, binäre Daten in Antwort von Datenbank (Postgresql 9.6.5) mit Hibernate 5.2.11.Final (BLOB-Typ) und Vert.x 3.4 .2, aber ich erhalte falsche Antwort (es sieht für mich aus wie einige Bits fehlen). Hier ist mein Code in Kotlin:Vert.x Chunked Antwort mit Daten aus der Datenbank mit BLOB und Hibernate
fun getFile(user: User, messageId: Long, fileId: Short, response: HttpServerResponse) {
val mediaContent = mediaContentRepository.getFile(messageId, fileId)
when {
mediaContent == null ->
response.apply { statusCode = 404 }.end()
conversationUserRepository.authorize(user.id!!, mediaContent.message!!.conversation!!.id, mediaContent.message!!.created) ->
response.setChunked(true)
.putHeader("Content-Disposition", "attachment; filename=\"${mediaContent.name}\"") //TODO: prevent injections
.putHeader("Content-Type", mediaContent.contentType)
//.putHeader("Content-Length", mediaContent.file.length().toString())
.apply {
//write(Buffer.buffer().apply { delegate.setBytes(0, mediaContent.file.binaryStream.readAllBytes()) })
val buffer = Buffer.buffer(BUFFER_SIZE)
val stream = mediaContent.file.binaryStream
val byteArray = ByteArray(BUFFER_SIZE)
for (i in (0L..(mediaContent.file.length()/BUFFER_SIZE))) {
val bytesRead = stream.read(byteArray)
buffer.delegate.setBytes(0, byteArray, 0, bytesRead)
write(if (bytesRead == BUFFER_SIZE) buffer else buffer.slice(0, bytesRead))
}
}
.end()
else ->
response.apply { statusCode = 403 }.end()
}
}
Aber wenn ich versuche, auf einmal ganze Datei senden diese Linie verwenden, Antwort ist richtig.
write(Buffer.buffer().apply { delegate.setBytes(0, mediaContent.file.binaryStream.readAllBytes()) })
Irgendeine Idee, was ich falsch mache?
EDIT: Es kann auch hilfreich sein, dass ich normalerweise verschiedene Antworten für die gleiche Datei erhalten.