1

システムと呼ばれるテーブルがあり、主に数値/文字型の列がいくつかありますが、ドキュメントを保持するためのバイナリ型が 1 つあります (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 しかし、ケースクラスを変更する必要があるかどうか、またはどのように変更する必要があるかについては言及されていないので混乱します-そして、ファイルが保存されている変数は何ですか(ifそれは)コードでアクセスできるようにするためですか?

ケースクラスを変更する必要がありますか (そうであれば、どのタイプを追加する必要がありますか)? コントローラーでフォームを変更する必要があります (その場合、どのタイプを追加する必要がありますか?)

インラインで保存するかbfileとして保存するかは気にしませんが、上記のようにどのように処理できますか?

ありがとうございました

4

1 に答える 1

0

考慮すべき項目がいくつかあります。

  1. ファイルには、ファイル アップロード フィールド.scala.htmlが必要です。 <input type="file" name="someName">

  2. ドキュメントに記載されているように、フォームのエンコーディング タイプを設定する必要があります'enctype -> "multipart/form-data"

  3. 次に、コントローラをmultipart form-data を処理するように変更すると、例のようになります。Action(parse.multipartFormData)フォームを解析するために使用します。これまで試したことはありませんが、systemForm.bindFromRequest(フォーム 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"
    )
  }

}

于 2013-10-22T05:17:27.580 に答える