2012-07-12 42 views
16

我試圖讓用戶上傳照片到服務器,然後查看它們。上傳按照in this guide的描述進行。下面是代碼:如何使用Scala在Play!2中上傳文件?

def upload = Action(parse.multipartFormData) { request => 
    request.body.file("picture").map { picture => 
    import java.io.File 
    val filename = picture.filename 
    val contentType = picture.contentType 
    picture.ref.moveTo(new File("/tmp/picture")) 
    Ok("File uploaded") 
    }.getOrElse { 
    Redirect(routes.Application.index).flashing(
     "error" -> "Missing file" 
    ) 
    } 
} 

這是我不清楚如何服務於上傳的圖片回到那個想看到他們的用戶。現在我將服務器託管在我自己的機器上,因此指南中的代碼片段將這些文件寫入我的D:驅動器,這不是(也不應該)可以從Internet獲得。據我所見,有兩種選擇:

  1. 將照片存儲在我的項目(專用於資產的項目)中的/ public文件夾下。看到這裏:http://www.playframework.org/documentation/2.0/Assets

  2. 寫我自己的控制器,從我的驅動器servs圖像形成自定義位置。

對於1,我不確定這是否是資產的目的。對於2,我不知道如何編寫這樣的控制器。

回答

9

2.0.3將以 external Assets controller爲特色,可能(誤)用於此。編寫這樣一個控制器並不是什麼神奇的東西,你有預定義的文件夾來保存所有的上傳文件,這就是你讀取它們的地方。在數據庫中保存(唯一)文件名。

另一種方法是將上傳的文件保存在數據庫中。我們用MongoDB中的GridFS來做到這一點。自定義控制器將它們返回給用戶。這樣你的數據存儲在一箇中心位置,這也使備份和恢復更簡單。

+0

有趣。這是我的理解,然而,將文件存儲到數據庫中可能是不好的做法,下面這個問題:http://stackoverflow.com/questions/11416735/how-to-upload-a-file-to-the-database-使用playframework-in-scala – 2012-07-12 12:52:05

+1

一如既往,這取決於。與Amazon S3一樣,GridFS也是爲這類問題而制定的。如果您將文件存儲在本地文件系統中,那麼當您需要第二臺服務器時,您遇到很大問題。看看Assets控制器,是不是很難理解。 – 2012-07-12 12:56:51

+0

您也可以使用NAS在服務器之間共享存儲並將其安裝在正確的位置。您也可以將您的文件上傳到CDN並讓它爲您的文件提供服務。使用MongoDB僅僅用於文件存儲並不是我認爲的更好的選擇。 – iwalktheline 2012-07-12 15:46:32

18

這個簡單的例子是

def index = Action { 
    Ok.sendFile(new java.io.File("/tmp/fileToServe.pdf")) 
} 

有「服務檔案」部分https://www.playframework.com/documentation/2.4.x/ScalaStream#Serving-files解釋如何提供文件

+0

由於它在開發模式下被禁用,我會傾向於這個解決方案而不是ExternalAssets控制器。 – 2014-09-17 11:43:46

+0

問題不在於如何提供文件,而是如何提供**上傳的**文件,以及是否可以上傳到您的資產文件夾。 – 2016-01-05 11:24:50

0

您可以添加這樣一個新的路線:

GET  /myFiles/*file    controllers.Assets.at(path="/tmp", file) 
+0

我不指望這起作用:「在構建過程中,公用文件夾的內容將被處理並添加到應用程序類路徑中。」 – stewSquared 2014-11-27 23:28:58

+0

PUBLIC文件夾的內容...閱讀文檔的其餘部分。它應該正常工作。 - > https://www.playframework.com/documentation/2.0/資產 – Peanut 2014-11-28 20:57:04

相關問題