2017-10-17 4 views
3

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.

Antwort

0

Ich habe es funktioniert, aber ich weiß nicht genau, warum es funktioniert. Es sieht einfach so aus, als gäbe es ein Problem mit der Wiederverwendung von vert.x Puffer in Schleifen. Code unter

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