我正在尝试使用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))
}
关于如何让异步方法工作的任何建议?
答案 0 :(得分:2)
您实际上不需要在这里使用Action.async
,因为Ok.sendFile
已经是非阻止的。来自the docs:
默认情况下,播放操作是异步的。例如,在下面的控制器代码中,代码的
{ Ok(...) }
部分不是控制器的方法体。它是一个匿名函数,它被传递给Action
对象的apply
方法,该方法创建一个Action类型的对象。在内部,您将编写您编写的匿名函数,其结果将包含在Future
中。def echo = Action { request => Ok("Got request [" + request + "]") }
注意:
Action.apply
和Action.async
都创建以相同方式在内部处理的Action对象。有一种Action是异步的,而不是两种(同步的和异步的)。.async
构建器只是简化基于返回Future的API创建操作的工具,这使得编写非阻塞代码变得更加容易。
换句话说,在这种特定情况下,不要担心将Result
包裹在Future
中,只需返回Ok.sendFile
。
最后,两个版本都按预期工作(文件已正确发送)。也许你有另一个与你如何宣布你的行为无关的问题。