2011-06-16 50 views
3

我們有一個內容管理系統,允許我們的用戶存儲通過REST Web服務上傳的文件。在將這些文件存儲在存儲庫之前,它們的內容將被加密。臨時內存中的Java文件

檢索這些文件時,文件內容被解密,並放入一個字節數組中。其目的是將這些內容作爲文件附件傳遞給客戶端,以便將其存儲在本地計算機上。

爲此,我正在將內容存儲到臨時文件中,並將臨時文件作爲附件傳回。這種方法具有先前加密的存儲庫文件的不良副作用,被「清除」存儲在臨時目錄中。

我知道我可以將臨時文件設置爲當JVM結束時自動刪除,但由於這是一臺服務器,因此服務器重新啓動之間可能會有很長時間。

我也可以(我猜)設置某種偵聽器作業來定期檢查臨時目錄並刪除超過特定年齡的文件,但這看起來很麻煩並且不能真正解決問題 - 它只是縮短了曝光時間。

我正在尋找替代品來避免臨時文件,但仍允許用戶通過Web服務作爲附件下載(最好在內存中)文件。

有什麼想法?

謝謝!

+2

不要使用deleteOnExit - 它僅適用於開發。它會泄漏文件名,直到整個JVM停止。 – bestsss 2011-06-16 15:34:09

回答

2

嗯,我想你可以將數據存儲在Java對象中,例如HashMap並將其用作緩存(使用弱引用,以便在Garbage Collector決定執行此操作時緩存可以收集垃圾)。如果這意味着使用中堆的數量會產生嚴重後果,那麼您可以查看正在運行的memcache或Java等價物,例如ehcache將對象存儲在遠離JVM堆的地方。

是否有一個原因,你不能只是流結果回來,以便當它完成後它被JVM清理?

+0

這是我希望做的(使用流),但不知道如何通過Http響應來回滾結果。那可能嗎? FWIW我使用Restlet作爲我的REST WS框架。 – Vinnie 2011-06-16 15:41:48

+0

我想你只是得到了HTTP response.getOutputStream();寫信給它,然後刷新它。 – planetjones 2011-06-16 15:44:40

+0

就像將數據流傳輸到HttpServletRepose輸出流一樣簡單?也許我過了這個想法......謝謝 – Vinnie 2011-06-16 15:46:59

2

Stream是否是選項?缺點是你將所有內容都存儲在內存中。

+0

這就是我希望做的事情,但不知道如何通過Http Response迴應結果。那可能嗎? FWIW我使用Restlet作爲我的REST WS框架。 – Vinnie 2011-06-16 15:39:43

1

是否有任何理由爲什麼你必須返回一個File對象,或者這是你可以改變的東西?

我問的原因是,您可以創建一個接口,其中有幾個方法,如getName()getContentStream()等,然後將其傳回,而不是具體的File對象。

0

有一件事你可以看看而不是一個文件Memcached並刪除該文件,一旦你完成解密它。

此外,您可以將加密文件存儲在數據庫中作爲blob並將其作爲流檢索。那麼你應該能夠即時解密它。

0

難道你不只是保持一個清晰的臨時文件的引用,並在加密完成後立即刪除它?也許更多地描述你的這個過程是什麼在做文件創建?