如何使用Scala在Play!2中提供上传的文件?

时间:2012-07-12 11:52:18

标签: scala playframework playframework-2.0

我正在尝试允许用户将照片上传到服务器然后查看它们。按照in this guide所述进行上传。这是代码:

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. 编写我自己的控制器,从我的驱动器中提供自定义位置的图像。

  3. 对于1,我不确定这是否是资产的目的。 对于2,我不知道如何编写这样的控制器。

3 个答案:

答案 0 :(得分:18)

简单的例子是

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

https://www.playframework.com/documentation/2.4.x/ScalaStream#Serving-files处有“服务文件”部分,其中介绍了如何提供文件

答案 1 :(得分:9)

2.0.3将以external Assets controller为特色,可能(错误)用于此目的。编写这样一个控制器并不神奇,你有预定义的文件夹来保存所有上传文件,这就是你从中读取它们的地方。在数据库中保存(唯一)文件名。

另一种方法是将上传的文件保存在数据库中。我们在MongoDB中使用GridFS执行此操作。自定义控制器将它们提供给用户。这样,您的数据就存储在一个中心位置,这也使备份和恢复更加简单。

答案 2 :(得分:0)

您可以添加如下新路线:

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