3

I have a model

case class Person(
  _id: ObjectId = new ObjectId,
  empno: String,
  name: String,
  picture: String
)

I'm a bit lost on how do I handle the picture upload on the form, controller and view. Appreciate help for sample or point me to the correct direction.

4

1 回答 1

2

此答案使用 GridFS,但是您可以使用方法中的文件执行您想要的操作upload

表单视图:

@helper.form(routes.Application.upload, 'enctype -> "multipart/form-data") {
  @helper.inputFile(form("photo"))
  <button type="submit">upload</button>
}

显示视图:

<img src='@routes.Application.getPhoto(fileId)'/>

控制器:

def upload = Action(parse.multipartFormData) { request =>
  request.body.file("photo") match {
    case Some(photo) =>
      val gridFs = salat.gridFS("photos")
      val uploadedFile = gridFs.createFile(photo.ref.file)
      uploadedFile.contentType = photo.contentType.orNull
      uploadedFile.save()
      Ok(...)
    case None => BadRequest("no photo")
  }
}

def getPhoto(file: ObjectId) = Action {
  import com.mongodb.casbah.Implicits._

  val gridFs = salat.gridFS("photos")

  gridFs.findOne(Map("_id" -> file)) match {
    case Some(f) => SimpleResult(
      ResponseHeader(OK, Map(
        CONTENT_LENGTH -> f.length.toString,
        CONTENT_TYPE -> f.contentType.getOrElse(BINARY),
        DATE -> new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", java.util.Locale.US).format(f.uploadDate)
      )),
      Enumerator.fromStream(f.inputStream)
    )

    case None => NotFound
  }
}

路线:

GET /upload controllers.Application.upload
GET /photos/:file controllers.Application.getPhoto(file: ObjectId)
于 2012-12-27T10:22:07.710 回答