2017-10-17 139 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() 
     } 
    } 
代碼