1

scala プログラムで特定の URL の画像をダウンロードしたいと考えています。私は次のようなことをしようとしていますが、見つけることができるすべてのディスパッチャーの例は、データストリームではなくテキストについて話しています。ディスパッチを使用して URL からバイナリをダウンロードする例を教えてもらえますか? img を直接使用しようとすると、Future に関するコンパイラ バーフが表示されます。

私が実行しようとしているタスクは、Facebook のプロフィール画像を取得することです。

  def copyUrl( uri : String ) : Array[Byte] = {
    val svc = url(uri)
    val img = Http(svc OK as.Bytes)
    for ( i <- img )  {
      println(i)
    }
    // something here but no idea
    img.map(_.toArray)
  }

次のコンパイラ エラーが表示されます

ProfileImage.scala:31: type mismatch;
[error]  found   : scala.concurrent.Future[Array[Byte]]
[error]  required: Array[Byte]
[error]           img.map(_.toArray)
[error]                  ^
[error] one error found

私も試してみました

  def copyUrl( uri : String ) : Array[Byte] = {
    result = scala.io.Source.fromURL(uri).map(_.toByte).toArray
  }

その結果、

Exception being returned to browser when processing /oauth/welcome java.nio.charset.MalformedInputException: Input length = 1
4

1 に答える 1

5

Dispatch は の を返しているFutureのでArray[Byte]、 を取得するには Future を適用する必要がありますArray[Byte]。次の行を変更してみてください。

val img = Http(svc OK as.Bytes)()

()その行の最後にa を追加したことに注意してください。Futureこれにより、ブロックが適用され、結果が待機されます。ブロッキングは理想的ではなく、ディスパッチFutureは非同期コールバックもサポートしていますが、これは、欠落しているものを示すという例の目的で機能します。

于 2013-04-28T12:03:46.757 に答える