31 releases

Uses old Rust 2015

0.13.0 Oct 1, 2020
0.12.3 Mar 28, 2019
0.12.2 Sep 20, 2017
0.12.1 Mar 11, 2017
0.5.0 Jul 9, 2015

#6 in #form-data

Download history 98/week @ 2021-06-07 1077/week @ 2021-06-14 899/week @ 2021-06-21 349/week @ 2021-06-28 628/week @ 2021-07-05 520/week @ 2021-07-12 473/week @ 2021-07-19 792/week @ 2021-07-26 225/week @ 2021-08-02 945/week @ 2021-08-09 333/week @ 2021-08-16 242/week @ 2021-08-23 889/week @ 2021-08-30 1930/week @ 2021-09-06 1720/week @ 2021-09-13 990/week @ 2021-09-20

664 downloads per month
Used in less than 8 crates

MIT license

31KB
548 lines

formdata

Build Status MIT licensed

Documentation is available at https://mikedilger.github.io/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.


lib.rs:

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);
}

Dependencies

~6.5MB
~140K SLoC