§ファイルアップロード
§multipart/form-data を利用したフォームからのファイルアップロード
Web アプリケーションにおけるファイルアップロードの標準的な方法は、 multipart/form-data
エンコーディングのフォームを使うことです。 multipart/form-data
を使うと、標準的なフォームデータに加えて、ファイルを添付データとして一緒に送信することができます。
Note: フォームの 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(s"/tmp/picture/$filename"))
Ok("File uploaded")
}.getOrElse {
Redirect(routes.Application.index).flashing(
"error" -> "Missing file")
}
}
ref
属性は TemporaryFile
への参照です。これは、 multipartFormData
パーサーがファイルアップロードを処理するデフォルトの方法です。
これまでのように anyContent
ボディパーサーを使って、 request.body.asMultipartFormData
によりフォームデータを参照することもできます。
最後に、 POST
ルーティングを追加します
POST / controllers.Application.upload()
直接的なファイルアップロード
サーバへファイルを送信する別の方法は、Ajax を活用してフォームからファイルを非同期的にアップロードするというものです。この方法では、リクエストボディは multipart/form-data
としてエンコードされず、単にファイルの内容を含むだけになります。
この場合も、リクエストボディの内容をファイルへ保存するためのボディパーサーを使うだけです。この例では、 temporaryFile
ボディパーサーを使ってみましょう。
def upload = Action(parse.temporaryFile) { request =>
request.body.moveTo(new File("/tmp/picture/uploaded"))
Ok("File uploaded")
}
§ボディパーサーを自作する
一時ファイルへのバッファリングなしでファイルアップロードを直接的に処理したい場合、 BodyParser
を自作するという方法があります。その場合、チャンクに分割されたデータを受信して、それを好きなところに PUSH 送信することになります。
multipart/form-data
エンコーディングを利用したい場合は、 PartHandler[FilePart[A]]
を指定して、デフォルトの multipartFormData
パーサーを利用することができます。その場合、パートヘッダーを元に、正しい FilePart
を生成するような Iteratee[Array[Byte], FilePart[A]]
を生成する必要があります。
Next: SQL データベースアクセス
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。