2015-01-26 75 views
4

我知道以前有類似的問題。但我不認爲我在google/stackoverflow上找到的解決方案適合我。用Spray發送大文件

我開始用Scala/Spray編寫一些Web服務,似乎發送大文件而不消耗大量內存的最佳方式是使用流編組。這樣Spray會發送http塊。兩個問題:

  1. 是否可以在不使用HTTP塊的情況下發送文件,也不需要將整個文件讀入內存?

  2. AFAIK akka.io每次只處理一個寫操作,這意味着它可以緩衝一個寫操作,直到它完全傳遞到O/S內核。對於每個HTTP響應,是否可以告訴Spray內容的長度?此後Spray會詢問新的數據(通過akka消息),直到整個內容長度完成。例如,我指出我的內容長度是100字節。噴霧向我的演員發送一條消息詢問數據,我提供50個字節。一旦這些數據被傳送到O/S,噴霧會發送另一個消息詢問新數據。我提供剩餘的50個字節......然後完成響應。

回答

2

是否可以發送文件,而無需使用HTTP塊[上線]

是的,你需要啓用chunkless流。請參閱http://spray.io/documentation/1.2.4/spray-routing/advanced-topics/response-streaming/

無論您使用流編碼器還是自行提供響應,Chunkless streaming都可以工作。看下面的例子。

而不讀取整個文件到內存

是的,如果你提供的數據作爲Stream[Array[Byte]]Stream[ByteString]應該工作。

[...]此後噴霧會要求新的數據[...]

這實際上幾乎就像它已經工作原理:如果您手動地提供數據塊,您可以要求定製的確認消息當噴罐層能夠處理下一個部分時,這將被送回給你。請參閱this example瞭解如何從噴霧路線進行流動。

我表明我的內容長度爲100字節

的說明前期:在HTTP你不嚴格需要指定響應的內容長度,因爲一個響應體可以通過關閉分隔連接,這是什麼噴霧如果chunkless流啓用。但是,如果您不想關閉連接(因爲您將丟失此持續連接),則現在可以在您的ChunkedResponseStart消息(請參閱#802)中指定明確的Content-Length標題,以防止連接關閉。

+0

謝謝!完美的答案! – sapito 2015-02-04 20:16:50