如何在Scala中停止使用Play WS 2.5进行流式下载?

时间:2016-10-19 18:32:44

标签: scala playframework akka-stream

我想下载图像的前几个kb,然后从内容中获取一个InputStream。最终,我使用ImageIO来获取图像的尺寸,而且只需要阅读一点。

我有代码工作,可以快速从流中读取图像,并在读取一点图像后返回,但下载继续在后台进行 - 耗费传输带宽。

我是Akka Streams的新手,并且无法弄清楚如何从Play中的流媒体文档中获取能够消耗一点,像在InputStream中那样抓取它,并停止下载。

ws.url(uri).withMethod("GET").stream().map { res =>
  val is = res.body.runWith(StreamConverters.asInputStream())

  // Efficiently gets dimensions without needing the entire file
  val dimensions = dimensionsFromImageIo(is)

  // This doesn't stop the download :(
  is.close()
}

然后,我尝试了类似这样的内容,但shutdown上的abortkillSwitch都没有停止下载,后台继续下载,我可以通过监控带宽看到

ws.url(uri).withMethod("GET").stream().map { res =>
  val (killSwitch, is) = res.body
    .viaMat(KillSwitches.single)(Keep.right)
    .toMat(StreamConverters.asInputStream())(Keep.both)
    .run()

  val dimensions = dimensionsFromImageIo(is)
  is.close()

  // This doesn't stop the download either
  killSwitch.shutdown()
}

0 个答案:

没有答案