Java Vert.x使用BLOB和hibernate使用数据库中的数据对答案进行分块

Java Vert.x使用BLOB和hibernate使用数据库中的数据对答案进行分块,java,postgresql,hibernate,kotlin,vert.x,Java,Postgresql,Hibernate,Kotlin,Vert.x,我尝试使用Hibernate 5.2.11.Final(BLOB类型)和Vert.x 3.4.2从数据库(Postgresql 9.6.5)发送大块二进制数据作为响应,但收到了错误的响应(在我看来,有些位丢失了)。以下是我在Kotlin中的代码: fun getFile(user: User, messageId: Long, fileId: Short, response: HttpServerResponse) { val mediaContent = mediaContentRep

我尝试使用Hibernate 5.2.11.Final(BLOB类型)和Vert.x 3.4.2从数据库(Postgresql 9.6.5)发送大块二进制数据作为响应,但收到了错误的响应(在我看来,有些位丢失了)。以下是我在Kotlin中的代码:

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()
    }
}
但当我试图使用这一行同时发送整个文件时,响应是正确的

write(Buffer.buffer().apply { delegate.setBytes(0, mediaContent.file.binaryStream.readAllBytes()) })
知道我做错了什么吗


编辑:对于同一个文件,我通常会收到不同的响应,这也很有帮助。

我让它工作了,但我不知道它工作的确切原因。就我而言,在循环中重用vert.x缓冲区似乎有问题。代码如下

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.putHeader("Content-Disposition", "attachment; filename=\"${mediaContent.name}\"") //TODO: prevent injections
                        .putHeader("Content-Type", mediaContent.contentType)
                        .putHeader("Content-Length", mediaContent.file.length().toString())
                        .apply {
                            val stream = mediaContent.file.binaryStream
                            val byteArray = ByteArray(BUFFER_SIZE)
                            for (i in (0L..(mediaContent.file.length() / BUFFER_SIZE))) {
                                val bytesRead = stream.read(byteArray)
                                write(Buffer(io.vertx.core.buffer.Buffer.buffer(byteArray)
                                        .let {
                                            if (bytesRead == BUFFER_SIZE) it
                                            else it.slice(0, bytesRead)
                                        }))
                            }
                        }
                        .end()
            else ->
                response.apply { statusCode = 403 }.end()
        }
    }