2011-06-14 75 views
2

通常在Play框架中,當您上傳文件時,它將顯示爲控制器的File對象,並且文件本身存儲在tmp文件夾中。在GAE中,這將不起作用,因爲GAE不允許寫入文件系統。玩! + GAE +文件上傳

如何上傳文件並直接在控制器中訪問流?

+1

不熟悉Play!特別是 - 是否有一個原因,你不能上傳文件到blobstore,然後閱讀blob? – 2011-06-14 23:12:21

+0

我不需要存儲文件本身,我需要從中讀取數據,然後存儲該數據。 – 2011-06-16 13:50:45

回答

3

所以我想出瞭解決方案。在控制器中,不是傳入一個File對象,而是傳入一個byte [],並使用ByeArrayInputStream將其轉換爲更有用的形式。在我的情況下,我需要將文件數據傳遞給採用InputStream的csv解析器。

+0

如何在使用字節數組時獲取上傳的文件名? – Somatik 2012-01-13 09:35:06

+0

爲了我的目的,我不需要知道文件名,所以我不是100%確定的,但是您可能能夠在請求標頭中找到某處? – 2012-01-17 15:25:38

+0

@Somatik您可以像http://stackoverflow.com/a/7571000/467650中所做的那樣使用Upload對象而不是字節數組。感謝羅伊 – 2012-07-18 14:39:27

0

我不熟悉的遊戲框架,要麼但通常,對於多部分請求(如文件上傳),

  1. 數據從InputStream是,如果輸入寫入到一個臨時文件在本地文件系統大小足夠大
  2. 然後將請求分派給您的控制器
  3. 您的控制器從框架中獲取File對象。 (此文件對象指向臨時文件)

爲Apache公地上傳,您可以使用DiskFileItemFactory框架決定是否將文件寫入到磁盤或保存在內存之前設置大小閾值。如果保存在內存中,框架會將數據複製到DataOutputStream(這是透明地完成的,所以您的servlet仍然可以使用File對象而不必知道該文件是在磁盤上還是在內存中)。

也許在播放框架中有類似的配置。