-
Notifications
You must be signed in to change notification settings - Fork 3
ScalaFileUpload
The standard way to upload files in a web application is to use a form with a special multipart/form-data encoding, which lets you mix standard form data with file attachment data. Please note: the HTTP method for the form have to be POST (not GET).
Start by writing an HTML form:
@helper.form(action = routes.Application.upload, 'enctype -> "multipart/form-data") {
<input type="file" name="picture">
<p>
<input type="submit">
</p>
}
Now define the upload action using a multipartFormData body parser:
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"
)
}
}The ref attribute give you a reference to a TemporaryFile. This is the default way the mutipartFormData parser handles file upload.
Note: As always, you can also use the
anyContentbody parser and retrieve it asrequest.asMultipartFormData.
Another way to send files to the server is to use Ajax to upload the file asynchronously in a form. In this case the request body will not have been encoded as multipart/form-data, but will just contain the plain file content.
In this case we can just use a body parser to store the request body content in a file. For this example, let’s use the temporaryFile body parser:
def upload = Action(parse.temporaryFile) { request =>
request.body.moveTo(new File("/tmp/picture"))
Ok("File uploaded")
}If you want to handle the file upload directly without buffering it in a temporary file, you can just write your own BodyParser. In this case, you will receive chunks of data that you are free to push anywhere you want.
If you want to use multipart/form-data encoding, you can still use the default mutipartFormData parser by providing your own PartHandler[FilePart[A]]. You receive the part headers, and you have to provide an Iteratee[Array[Byte], FilePart[A]] that will produce the right FilePart.
- HTTP programming
- Asynchronous HTTP programming
- The template engine
- HTTP form submission and validation
- Working with JSON
- Working with XML
- Handling file upload
- Accessing an SQL database
- Using the Cache
- Calling WebServices
- Integrating with Akka
- Internationalization
- The application Global object
- Testing your application
- Securing your application