【问题标题】:Sending large files with Spray使用 Spray 发送大文件
【发布时间】:2015-01-26 19:20:32
【问题描述】:

我知道以前有人问过非常相似的问题。但我不认为我在 google/stackoverflow 上找到的解决方案适合我。

我开始使用 Scala/Spray 编写一些 Web 服务,似乎在不消耗大量内存的情况下发送大文件的最佳方法是使用流编组。这样,Spray 将发送 http 块。两个问题:

  1. 是否可以在不使用 HTTP 块且不将整个文件读入内存的情况下发送文件?

  2. AFAIK akka.io 一次只处理一个写入,这意味着它可以缓冲一个写入,直到它被完全传递给 O/S 内核。对于每个 HTTP 响应,是否可以告诉 Spray 内容的长度?此后,Spray 将请求新数据(通过 akka 消息),直到完成整个内容长度。例如,我表示我的内容长度是 100 字节。 Spray 向我的 actor 发送一条请求数据的消息,我提供 50 个字节。一旦这些数据被传递到 O/S,spray 就会发送另一条消息来请求新数据。我提供剩余的 50 个字节...然后响应完成。

【问题讨论】:

    标签: scala akka spray


    【解决方案1】:

    是否可以在不使用 HTTP 块的情况下发送文件 [在线]

    是的,您需要启用无块流。见http://spray.io/documentation/1.2.4/spray-routing/advanced-topics/response-streaming/

    无论您是使用 Stream marshaller 还是自己以 MessageChunks 的形式提供响应,无块流式处理都可以正常工作。请参见下面的示例。

    无需将整个文件读入内存

    是的,如果您以 Stream[Array[Byte]]Stream[ByteString] 的形式提供数据,这应该可以工作。

    [...] 此后,Spray 会要求提供新数据 [...]

    这实际上几乎就像它已经工作了:如果您手动提供块,您可以请求自定义 Ack 消息,当喷罐层能够处理下一部分时,该消息将返回给您。请参阅this example,了解如何从喷洒路线流出。

    我表示我的内容长度是 100 字节

    提前说明:在 HTTP 中,您不需要为响应指定内容长度,因为可以通过关闭连接来分隔响应主体,如果启用了无块流式传输,则喷雾会执行此操作。但是,如果您不想关闭连接(因为您将丢失此持久连接),您现在可以在您的 ChunkedResponseStart 消息中指定一个显式的 Content-Length 标头(请参阅#802),这将阻止关闭连接。

    【讨论】:

    • 谢谢!完美答案!
    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多