我有一个akka actor,它会生成一堆文件,然后将它们拉上来,并返回该zip文件。我想将此文件传回给完整的喷涂路由方法,以允许下载zip文件。
我真的希望能够使用getFileFrom,但我似乎无法找到一种方法来利用未来的回归。我也尝试将文件传回完整的函数,但是得到了一个非常神秘的错误。
如何连结期货以获得我想在浏览器中下载的结果?
以下是我正在使用的一些代码
get {
path("test") {
respondWithMediaType(`application/zip`) {
complete {
val pi = new PackageInfo("Test")
doCreate(pi)
}
}
}
}
def doCreate(pi: PackageInfo) = {
val response = (worker ? Create(pi))
.mapTo[Ok]
.map(result => result.zipFile: File)
.recover { case _ => "error" }
response
}
尝试不同的事情时收到的许多错误之一
could not find implicit value for parameter marshaller: spray.httpx.marshalling.ToResponseMarshaller[scala.concurrent.Future[Comparable[_ >: java.io.File with String <: Comparable[_ >: java.io.File with String <: java.io.Serializable] with java.io.Serializable] with java.io.Serializable]]
答案 0 :(得分:5)
这里有几点需要解决。
一个是在创建该文件并将其发送到客户端后,您可能希望将其删除。如果您只是使用getFromFile
(doc)发送它,那么您将不知道客户端何时完成下载文件并且无法删除该文件。以下是如何实现该功能:Is it possible to install a callback after request processing is finished in Spray?。
缺少隐式的错误意味着Spray需要知道如何将数据封送回客户端。默认情况下,它只能编组字符串等基本类型,但您可以实现自己的自定义编组程序。如果您使用我提供的链接中描述的方法,那么您不必担心这一点。
最后,该答案还提供了一个分块响应,如果您的文件足够大,这个响应非常有用。
如果您决定使用getFromFile
,请查看以下答案:Spray send xls file to client。我认为这正是你所需要的。