【问题标题】:how to handle fileupload into a table in play framework?如何将文件上传到播放框架中的表格中?
【发布时间】:2013-10-17 10:55:55
【问题描述】:

我有一个名为 system 的表,它有一些列,主要是数字/字符类型,但有一种二进制类型用于保存文档(word 或 excel 等)

暂时忽略我们是否应该保持文件内联或外部,即 bfile 或 blob...问题更多是关于如何在播放框架中处理它

我已经让表单与模型视图和控制器一起工作......但我设置它没有文件字段只是为了让它工作:

我在模型中有一个案例类

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 但这让我感到困惑,它没有提及是否或如何更改案例类 - 以及存储在什么变量中的文件(如果是的话)以便我可以在我的代码中访问它?

我应该修改我的案例类(如果是,我应该添加什么类型)? 我应该修改控制器中的表单吗(如果是,我应该添加什么类型?)

我不介意我将其存储为内联文件还是作为 bfile - 但我该如何处理它?

谢谢

【问题讨论】:

    标签: forms scala file-upload playframework playframework-2.0


    【解决方案1】:

    有一些项目需要考虑:

    1. 在您的.scala.html 文件中,您需要一个文件上传字段 &lt;input type="file" name="someName"&gt;

    2. 您需要按照文档中的说明设置表单的编码类型'enctype -&gt; "multipart/form-data"

    3. 然后您可以将控制器更改为 处理多部分表单数据,因此它看起来像示例中的那个。使用Action(parse.multipartFormData) 解析表单。我认为您应该也可以使用systemForm.bindFromRequestfrom 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"
        )
      }
    

    }

    【讨论】:

    • 我将如何执行第 3 步?他们的示例使用仅包含文件的表单-不是一个很好的示例,说明如何进行多部分我将如何修改我在上面的控制器中的表单?特别是我会为文件选择什么类型(longNumber、文本等)?
    • 好的,我会看一下 - 你是说我没有将文件放在案例类中,我将其保留原样并在表上进行一种插入后更新以将文件放入桌子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多