使用play web api下载文件(异步)

时间:2016-08-05 19:18:23

标签: scala playframework future

我正在尝试使用play api框架下载文件。由于所有数据访问层都已经使用Futures实现,我希望下载以使用异步操作。但是,以下代码不起作用。如果不工作,我的意思是发送到客户端的文件与服务器上的文件不同。

  val sourcePath = "/tmp/sample.pdf"

  def downloadAsync = Action.async {
    Future.successful(Ok.sendFile(new java.io.File(sourcePath)))
  }

然而,这件作品有效:

  def download = Action {
    Ok.sendFile(new java.io.File(sourcePath))
  }

关于如何让异步方法工作的任何建议?

1 个答案:

答案 0 :(得分:2)

您实际上不需要在这里使用Action.async,因为Ok.sendFile已经是非阻止的。来自the docs

  

默认情况下,播放操作是异步的。例如,在下面的控制器代码中,代码的{ Ok(...) }部分不是控制器的方法体。它是一个匿名函数,它被传递给Action对象的apply方法,该方法创建一个Action类型的对象。在内部,您将编写您编写的匿名函数,其结果将包含在Future中。

def echo = Action { request =>
  Ok("Got request [" + request + "]")
}
     

注意Action.applyAction.async都创建以相同方式在内部处理的Action对象。有一种Action是异步的,而不是两种(同步的和异步的)。 .async构建器只是简化基于返回Future的API创建操作的工具,这使得编写非阻塞代码变得更加容易。

换句话说,在这种特定情况下,不要担心将Result包裹在Future中,只需返回Ok.sendFile

最后,两个版本都按预期工作(文件已正确发送)。也许你有另一个与你如何宣布你的行为无关的问题。