Github Actions Status crates.io Documentation MIT

multer-rs

An async parser for multipart/form-data content-type in Rust.

It accepts a Stream of Bytes as a source, so that It can be plugged into any async Rust environment e.g. any async server.

Docs

Install

Add this to your Cargo.toml:

toml [dependencies] multer = "1.0"

Basic Example

```rust use bytes::Bytes; use futures::stream::Stream; // Import multer types. use multer::Multipart; use std::convert::Infallible; use futures::stream::once;

[tokio::main]

async fn main() -> Result<(), Box> { // Generate a byte stream and the boundary from somewhere e.g. server request body. let (stream, boundary) = getbytestreamfromsomewhere().await;

// Create a `Multipart` instance from that byte stream and the boundary.
let mut multipart = Multipart::new(stream, boundary);

// Iterate over the fields, use `next_field()` to get the next field.
while let Some(field) = multipart.next_field().await? {
    // Get field name.
    let name = field.name();
    // Get the field's filename if provided in "Content-Disposition" header.
    let file_name = field.file_name();

    println!("Name: {:?}, File Name: {:?}", name, file_name);

    // Read field content as text.
    let content = field.text().await?;
    println!("Content: {:?}", content);
}

Ok(())

}

// Generate a byte stream and the boundary from somewhere e.g. server request body. async fn getbytestreamfromsomewhere() -> (impl Stream>, &'static str) { let data = "--X-BOUNDARY\r\nContent-Disposition: form-data; name=\"My Field\"\r\n\r\nabcd\r\n--X-BOUNDARY--\r\n"; let stream = once(async move { Result::::Ok(Bytes::from(data)) });

(stream, "X-BOUNDARY")

} ```

Usage with hyper.rs server

An example showing usage with hyper.rs.

For more examples, please visit examples.

Contributing

Your PRs and suggestions are always welcome.