如何将文件从Akka Worker返回到Spray Routing

时间:2014-07-30 23:45:30

标签: scala akka spray

我有一个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]]

1 个答案:

答案 0 :(得分:5)

这里有几点需要解决。

一个是在创建该文件并将其发送到客户端后,您可能希望将其删除。如果您只是使用getFromFiledoc)发送它,那么您将不知道客户端何时完成下载文件并且无法删除该文件。以下是如何实现该功能:Is it possible to install a callback after request processing is finished in Spray?

缺少隐式的错误意味着Spray需要知道如何将数据封送回客户端。默认情况下,它只能编组字符串等基本类型,但您可以实现自己的自定义编组程序。如果您使用我提供的链接中描述的方法,那么您不必担心这一点。

最后,该答案还提供了一个分块响应,如果您的文件足够大,这个响应非常有用。

如果您决定使用getFromFile,请查看以下答案:Spray send xls file to client。我认为这正是你所需要的。