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

Hen*_*son 16 scala playframework playframework-2.0

我正在尝试允许用户将照片上传到服务器然后查看它们.按照本指南中的说明进行上传.这是代码:

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"
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

我不清楚如何将上传的图像提供给想要查看它们的用户.现在我在自己的机器上托管服务器,因此指南中的代码片段将文件写入我的D:驱动器,这不是(也不应该)从Internet上获得.据我所知,有两种选择:

  1. 将照片存储在我的项目中的/ public文件夹下(专用于资产的文件夹).见这里:http://www.playframework.org/documentation/2.0/Assets

  2. 编写我自己的控制器,从我的驱动器中提供自定义位置的图像.

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

Eug*_*nov 18

简单的例子是

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

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


Mar*_*ier 9

2.0.3将具有外部资产控制器,可能(错误)用于此.编写这样一个控制器并不神奇,你有预定义的文件夹来保存所有上传文件,这就是你从中读取它们的地方.在数据库中,保存(唯一)文件名.

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