2012-07-12 86 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

相关问题