我有一个名为system的表,它有一些列主要是数字/字符类型但是有一个二进制类型用于保存文档(word或excel等)
现在忽略如果我们应该保持内联或外部文件,即bfile或blob ......问题更多的是关于如何在play框架中处理它
我已经使用了模型视图和控制器的表单...但我在没有文件字段的情况下设置它只是为了让它工作:
我在模型中有一个案例类
case class System(sys_id: Pk[Long] = NotAssigned
, sys_name: String
, sys_desc: String
, sys_owner1: Long
, sys_owner2: Long)
控制器中的表单
val systemForm = Form(
mapping(
"sys_id" -> ignored(NotAssigned:Pk[Long]),
"sys_name" -> nonEmptyText,
"sys_desc" -> nonEmptyText,
"sys_owner1" -> longNumber,
"sys_owner2" -> longNumber
)(System.apply)(System.unapply)
)
和视图中的表单
@form(routes.Systems.save(), 'class -> "form-horizontal") {
@inputText(systemForm("sys_name"), '_label -> "System Name")
@inputText(systemForm("sys_desc"), '_label -> "Description")
@select(
systemForm("sys_owner1"),
persons,
'_label -> "Primary Owner", '_default -> "-- Choose a person --",
'_showConstraints -> false
)
@select(
systemForm("sys_owner2"),
persons,
'_label -> "Secondary Owner", '_default -> "-- Choose a person --",
'_showConstraints -> false
)
<div class="control-group">
<div class="controls">
<input type="submit" value="Create System" class="btn btn-success"> or
<a href="@routes.Systems.list()" class="btn">Cancel</a>
</div>
</div>
}
这一切都很好......但是现在我想要添加文件,我该怎么办? 我看过这个http://www.playframework.com/documentation/2.1.2/ScalaFileUpload 但它让我困惑,它没有提到我是否或如何更改案例类 - 以及存储在哪个变量(如果是),以便我可以在我的代码中访问它?
我应该修改我的case类(如果是的话我应该添加什么类型)? 我应该修改控制器中的表格(如果是的话,我应该添加什么类型?)
我不担心我是将其存储为内联还是作为bfile存储 - 但我如何处理它如上所述?
谢谢
答案 0 :(得分:0)
有些事项需要考虑:
在.scala.html
文件中,您需要文件上传字段 <input type="file" name="someName">
。
您需要按照文档'enctype -> "multipart/form-data"
中所述设置表单的编码类型。
然后,您可以将控制器更改为处理多部分表单数据,因此它看起来像示例中的那个。使用Action(parse.multipartFormData)
来解析表单。我认为您应该也可以将您的表单与systemForm.bindFromRequest
(from Form API)一起使用,但我之前没有尝试过。
修改强>
我的意思是将上传的文件和其他表单数据视为单独的项目。
尝试将文档示例更改为:
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"))
// this is the new part
val formContents = systemForm.bindFromRequest.value
// now you can do stuff with `formContents` and `picture`
Ok("File uploaded")
}.getOrElse {
Redirect(routes.Application.index).flashing(
"error" -> "Missing file"
)
}
}