【问题标题】:How do I return a File from an Akka Worker to Spray Routing如何从 Akka Worker 将文件返回到 Spray Routing
【发布时间】:2014-07-31 21:31:02
【问题描述】:

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

【问题讨论】:

    标签: scala akka spray


    【解决方案1】:

    这里有几件事要解决。

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

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

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

    如果您决定选择getFromFile,请查看此答案:Spray send xls file to client。我认为这正是您所需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 2015-07-26
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多