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

Pie*_*ces 1 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
  }
Run Code Online (Sandbox Code Playgroud)

在尝试不同的事情时收到的许多错误之一

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]]
Run Code Online (Sandbox Code Playgroud)

yǝs*_*ǝla 5

这里有几点需要解决.

一个是在创建该文件并将其发送到客户端后,您可能想要删除它.如果您只是使用getFromFile(doc)发送它,那么您将无法知道客户端何时完成下载文件并且无法删除该文件.以下是如何实现该功能:在Spray中完成请求处理后是否可以安装回调?.

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

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

如果您决定继续getFromFile查看此答案:Spray将xls文件发送给客户端.我认为这正是你所需要的.