[][src]Crate formdata

This library provides a type for storing multipart/form-data data, as well as functions to stream (read or write) such data over HTTP.

multipart/form-data format as described by RFC 7578. HTML forms with enctype=multipart/form-data POST their data in this format. This enctype is typically used whenever a form has file upload input fields, as the default application/x-www-form-urlencoded cannot handle file uploads.

Whether reading from a stream or writing out to a stream, files are never stored entirely in memory, but instead streamed through a buffer.

Read Example

extern crate mime;
extern crate hyper;
extern crate formdata;

use hyper::server::{Server, Request, Response};

fn main() {
  let server = Server::http("0.0.0.0:0").unwrap().handle(handler).unwrap();
}

fn handler(hyper_request: Request, res: Response) {
  let (_, _, headers, _, _, mut reader) = hyper_request.deconstruct();
  let form_data = formdata::read_formdata(&mut reader, &headers).unwrap();

  for (name, value) in form_data.fields {
    println!("Posted field name={} value={}", name, value);
  }

  for (name, file) in form_data.files {
    println!("Posted file name={} path={:?}", name, file.path);
  }
}

Write Example

extern crate mime;
extern crate hyper;
extern crate formdata;

use std::path::Path;
use hyper::header::{Headers, ContentType};
use mime::{Mime, TopLevel, SubLevel};
use formdata::{FormData, FilePart};

fn main() {
  let mut stream = ::std::io::stdout();
  let mut photo_headers = Headers::new();
  photo_headers.set(ContentType(Mime(TopLevel::Image, SubLevel::Gif, vec![])));
  // no need to set Content-Disposition (in fact it will be rewritten)

  let formdata = FormData {
    fields: vec![ ("name".to_owned(), "Baxter".to_owned()),
                  ("age".to_owned(), "1 month".to_owned()) ],
    files: vec![ ("photo".to_owned(), FilePart::new(
         photo_headers, Path::new("/tmp/puppy.gif"))) ],
  };

  let boundary = formdata::generate_boundary();
  let count = formdata::write_formdata(&mut stream, &boundary, &formdata).unwrap();
  println!("COUNT = {}", count);
}

Structs

FilePart

A file that is to be inserted into a multipart/* or alternatively an uploaded file that was received as part of multipart/* parsing.

FormData

The extracted text fields and uploaded files from a multipart/form-data request.

Enums

Error

An error type for the formdata crate.

Functions

generate_boundary

Generate a valid multipart boundary, statistically unlikely to be found within the content of the parts.

read_formdata

Parse MIME multipart/form-data information from a stream as a FormData.

write_formdata

Stream out multipart/form-data body content matching the passed in formdata. This does not stream out headers, so the caller must stream those out before calling write_formdata().

write_formdata_chunked

Stream out multipart/form-data body content matching the passed in formdata as Transfer-Encoding: Chunked. This does not stream out headers, so the caller must stream those out before calling write_formdata().