2016-08-28 1 views
0

Je veux obtenir Array/List [Byte] de Enumerator [Array [Byte]]. Certains articles me montrent comment le faire dans playframework. Mais je n'utilise pas de framework de jeu pour ce projet. Voilà ce que j'ai:Comment lire les octets d'un fichier vers un tableau à partir de gridfs?

 lazy val gridfs = GridFS[BSONSerializationPack.type](db, "resource") 
     gridfs.find(BSONDocument("_id" -> BSONObjectID(id))).headOption.map{ 
     case Some(file) => { 
      //this gives me Enumerator[Array[Byte]]. 
      //I'm not using playframework, how to get Future[Array[Byte]] from here? 
      gridfs.enumerate(file) 
     } 
     } 

Répondre

1

Utilisation de la lecture Iteratees est pas spécifique à Play, mais le streaming, comme Akka ou flux RxStuff. Vous pouvez consommer tous les morceaux de cet énumérateur en utilisant Iteratee.consume.

val sink: Iteratee[Array[Byte], Array[Byte]] = Iteratee.consume[Array[Byte]]() 
val allInMem: Future[Array[Byte]] = enumerator |>>> sink 

Pour des raisons évidentes, il est recommandé de ne pas consommer de grandes données, mais d'utiliser Iteratee appropriée pour traiter les données d'une manière de streaming.

+0

J'ai actuellement deux méthodes, une pour obtenir un fichier entier à la fois, une autre pour écrire dans un flux. Cela vous dérange-t-il d'écrire un exemple qui convertit Enumerator en InputStream? Merci. –

+0

peu importe, je pense que je vais le garder comme Enumerator [Array [Byte]], et de le consommer en cas de besoin. –