Skip to content

File Uploads

Use multipart.parse to handle multipart/form-data requests.

Parsing the body

First, read the full body with middleware.body_limit, then parse:

gleam
import mistweaver/multipart

// In your handler (body already read by body_limit middleware):
case multipart.parse(c.request) {
  Error(e)    -> mw_response.bad_request(e)
  Ok(parts)  -> handle_parts(parts)
}

Accessing fields

gleam
let name = multipart.get_field(parts, "name") |> option.unwrap("")

Accessing uploads

gleam
let files = multipart.uploads(parts)

list.each(files, fn(part) {
  let assert Upload(name, filename, content_type, data) = part
  // data is BitArray — write to disk, store in S3, etc.
  save_upload(filename, data)
})

HTML form

html
<form method="POST" action="/upload" enctype="multipart/form-data">
  <input type="text" name="title" />
  <input type="file" name="attachment" />
  <button type="submit">Upload</button>
</form>

Body size limit

Always pair multipart parsing with middleware.body_limit to prevent large uploads from exhausting memory:

gleam
router.scope("/", [middleware.body_limit(10 * 1024 * 1024)], fn(r) {
  r |> router.post("/upload", upload_handler)
})

Released under the Apache 2.0 License.