Documentation

You are viewing the documentation for the 2.1.5 release in the 2.1.x series of releases. The latest stable release series is 2.4.x.

§ファイルアップロード

§multipart/form-data を利用したフォームからのファイルアップロード

Web アプリケーションにおけるファイルアップロードの標準的な方法は、multipart/form-data エンコーディングのフォームを使うことです。multipart/form-data を使うと、標準的なフォームデータに加えて、ファイルを添付データとして一緒に送信することができます。なお、フォームの HTTP メソッドは GET ではなく POST である必要があることに留意してください。

まず、 HTML フォームを書きます。

@helper.form(action = routes.Application.upload, 'enctype -> "multipart/form-data") {
    
    <input type="file" name="picture">
    
    <p>
        <input type="submit">
    </p>
    
}

次に、 multipartFormData ボディパーサーを利用して、 upload アクションを定義します。

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"
    )
  }
}

ref 属性は TemporaryFile への参照です。これは、multipartFormData パーサーがファイルアップロードを処理するデフォルトの方法です。

Note: これまでのように anyContent ボディパーサーを使って、request.asMultipartFormData によりフォームデータを参照することもできます。

§直接的なファイルアップロード

サーバへファイルを送信する別の方法は、Ajax を活用してフォームからファイルを非同期的にアップロードするというものです。この方法では、リクエストボディは multipart/form-data としてエンコードされず、単にファイルの内容を含むだけになります。

この場合も、リクエストボディの内容をファイルへ保存するためのボディパーサーを使うだけです。この例では、temporaryFile ボディパーサーを使ってみましょう。

def upload = Action(parse.temporaryFile) { request =>
  request.body.moveTo(new File("/tmp/picture"))
  Ok("File uploaded")
}

§ボディパーサーを自作する

一時ファイルへのバッファリングなしでファイルアップロードを直接的に処理したい場合、BodyParser を自作するという方法があります。その場合、チャンクに分割されたデータを受信して、それを好きなところに PUSH 送信することになります。

multipart/form-data エンコーディングを利用したい場合は、PartHandler[FilePart[A]] を指定して、デフォルトの multipartFormData パーサーを利用することができます。その場合、パートヘッダーを元に、正しい FilePart を生成するような Iteratee[Array[Byte]]FilePart[A]] を生成する必要があります。

次ページ: SQL データベースへのアクセス