2017-06-23 3 views
1

J'essaie de prendre un tableau d'octets à partir du fichier distant. J'ai créé AsyncStream mais je n'ai aucune idée de la façon de le transformer en un tableau d'octets approprié.Télécharger le fichier avec Finagle Http Client

val client: Service[http.Request, http.Response] = 
    Http 
     .client 
     .withStreaming(enabled = true) 
     .newService("www.scala-lang.org:80") 

    val request = http.Request(http.Method.Get, "/docu/files/ScalaOverview.pdf") 
    request.host = "scala-lang.org" 
    val response: Future[http.Response] = client(request) 

    def fromReader(reader: Reader): AsyncStream[Buf] = 
    AsyncStream.fromFuture(reader.read(Int.MaxValue)).flatMap { 
     case None => AsyncStream.empty 
     case Some(a) => a +:: fromReader(reader) 
    } 

    val result: Array[Byte] = 
    Await.result(response.flatMap { 
     case resp => 
     fromReader(resp.reader) ??? // what to do? 
    }) 

Répondre

2

Vous n'avez pas besoin fromReader, AsyncStream déjà a. Ainsi, vous pouvez faire quelque chose comme ceci:

val result: Future[Array[Byte]] = response 
    .flatMap { resp => 
    AsyncStream.fromReader(resp.reader) 
     .foldLeft(Buf.Empty){ _ concat _ } 
     .map(Buf.ByteArray.Owned.extract) 
    } 
1

Utilisez scalaj pour le téléchargement de fichiers.

import scalaj.http._ 

val response: HttpResponse[String] = Http("http://foo.com/search").param("q","monkeys").asString 

Voir la documentation pour différents types de demandes GET, POST, etc.

https://github.com/scalaj/scalaj-http

+0

grâce à cet outil. –