2011-12-08 80 views
0

我試圖在我的程序中創建一個功能,允許用戶將他們的數據下載到文件中。使用renderBinary()生成可下載文件

現在,我在我的控制器中創建了一個具有特定名稱的File對象,並使用FileWriter將內容加載到文件中。完成後,File對象被傳遞給renderBinary()。這將按照預期將文件發送給用戶。

但是,這將文件保存在我的Play!項目目錄發送之前。這使我想知道當有許多用戶試圖生成和下載文件時會發生什麼。他們會互相覆蓋嗎?

所以簡而言之,生成文件並通過renderBinary發送它們的最佳方法是什麼?

回答

3

在多用戶環境中,將文件數據保存爲常量文件名是不好的做法。您確實會冒風險,在單獨運行的線程中,您的文件可能會被覆蓋,或者由於另一個文件句柄被打開而導致IO異常。

更好的方法是在服務器端爲文件名生成一個隨機散列,並將其用作文件名。

+0

@torourke此外 - 以防萬一 - 不要忘記刪除臨時文件;-) – tmbrggmn

+0

@pHk好點。儘管您需要將其作爲計劃任務來完成,因爲一旦調用renderBinary()方法,就無法在您的操作中執行任何其他代碼。 – Codemwnci

+0

非常感謝。我已經改變了我的代碼來做到這一點,而且非常完美。我也用過這裏看到的例子:http://stackoverflow.com/questions/6693412/close-inputstream-after-renderbinary-call-in-play-framework – torourke

6
File f = File.createTempFile("prefix", "suffix");  
f.deleteOnExit(); 
// put contents into the file 
renderBinary(f); 
+1

絕不應該在服務器應用程序中使用deleteOnExit。 http://puneeth.wordpress.com/2006/01/23/filedeleteonexit-is-evil/ – Gary

+0

非常好的點加里,我沒有想到這一點。 –