Handling file uploads

Genie has built-in support for working with file uploads. The collection of uploaded files (as POST variables) can be accessed through the Requests.filespayload method. Or, we can retrieve the data corresponding to a given file form input by using Requests.filespayload(key) – where key is the name of the file input in the form.

In the following snippet we configure two routes in the root of the app (/): the first route, handling GET requests, displays an upload form. The second route, handling POST requests, processes the uploads, generating a file from the uploaded data, saving it, and displaying the file stats.


HEADS UP

Notice that we can define multiple routes at the same URL if they have different methods, in our case GET and POST.


Example

using Genie, Genie.Router, Genie.Renderer.Html, Genie.Requests

form = """
<form action="/" method="POST" enctype="multipart/form-data">
  <input type="file" name="yourfile" /><br/>
  <input type="submit" value="Submit" />
</form>
"""

route("/") do
  html(form)
end

route("/", method = POST) do
  if infilespayload(:yourfile)
    write(filespayload(:yourfile))

    stat(filename(filespayload(:yourfile)))
  else
    "No file uploaded"
  end
end

up()

Upon uploading a file and submitting the form, our app will display the file's stats.