2017-10-17 141 views
3

我尝试使用Hibernate 5.2.11.Final(BLOB类型)和Vert.x 3.4从数据库(Postgresql 9.6.5)响应数据块时发送二进制数据块。2,但我收到错误的反应(它看起来对我来说像一些位丢失)。这是我在Kotlin的代码:Vert.x使用BLOB和休眠从数据库中获取数据

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()) }) 

任何想法,我做错了吗?

编辑:这也是有帮助的,我通常会收到该同一文件不同的反应。

回答

0

我得到它的工作,但我不知道为什么它的工作。它只是对我来说貌似与循环再利用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() 
     } 
    } 
代码