2024-01-10 04:00:20 +00:00
# `actix-multipart`
2019-04-30 03:47:21 +00:00
2024-01-10 04:00:20 +00:00
<!-- prettier - ignore - start -->
2021-02-10 12:10:03 +00:00
[![crates.io ](https://img.shields.io/crates/v/actix-multipart?label=latest )](https://crates.io/crates/actix-multipart)
2024-07-06 23:34:18 +00:00
[![Documentation ](https://docs.rs/actix-multipart/badge.svg?version=0.7.2 )](https://docs.rs/actix-multipart/0.7.2)
2024-02-13 01:24:34 +00:00
![Version ](https://img.shields.io/badge/rustc-1.72+-ab6000.svg )
2021-02-10 12:10:03 +00:00
![MIT or Apache 2.0 licensed ](https://img.shields.io/crates/l/actix-multipart.svg )
< br / >
2024-07-06 23:34:18 +00:00
[![dependency status ](https://deps.rs/crate/actix-multipart/0.7.2/status.svg )](https://deps.rs/crate/actix-multipart/0.7.2)
2021-02-10 12:10:03 +00:00
[![Download ](https://img.shields.io/crates/d/actix-multipart.svg )](https://crates.io/crates/actix-multipart)
2021-06-26 15:33:36 +00:00
[![Chat on Discord ](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord )](https://discord.gg/NWpN5mmg3x)
2021-02-10 12:10:03 +00:00
2024-01-10 04:00:20 +00:00
<!-- prettier - ignore - end -->
2024-05-18 19:02:00 +00:00
2024-06-10 22:35:26 +00:00
<!-- cargo - rdme start -->
2024-05-18 19:02:00 +00:00
2024-07-07 19:32:56 +00:00
Multipart request & form support for Actix Web.
The [`Multipart`] extractor aims to support all kinds of `multipart/*` requests, including `multipart/form-data` , `multipart/related` and `multipart/mixed` . This is a lower-level extractor which supports reading [multipart fields ](Field ), in the order they are sent by the client.
Due to additional requirements for `multipart/form-data` requests, the higher level [`MultipartForm`] extractor and derive macro only supports this media type.
2024-05-18 19:02:00 +00:00
2024-06-10 22:35:26 +00:00
## Examples
2024-05-18 19:02:00 +00:00
```rust
use actix_web::{post, App, HttpServer, Responder};
2024-07-07 19:32:56 +00:00
use actix_multipart::form::{json::Json as MpJson, tempfile::TempFile, MultipartForm};
2024-05-18 19:02:00 +00:00
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct Metadata {
name: String,
}
#[derive(Debug, MultipartForm)]
struct UploadForm {
#[multipart(limit = "100MB")]
file: TempFile,
2024-07-07 19:32:56 +00:00
json: MpJson< Metadata > ,
2024-05-18 19:02:00 +00:00
}
#[post("/videos")]
pub async fn post_video(MultipartForm(form): MultipartForm< UploadForm > ) -> impl Responder {
format!(
"Uploaded file {}, with size: {}",
form.json.name, form.file.size
)
}
#[actix_web::main]
async fn main() -> std::io::Result< ()> {
HttpServer::new(move || App::new().service(post_video))
.bind(("127.0.0.1", 8080))?
.run()
.await
}
```
2024-07-01 02:55:08 +00:00
cURL request:
2024-06-07 15:04:04 +00:00
2024-07-01 02:55:08 +00:00
```sh
2024-05-18 19:02:00 +00:00
curl -v --request POST \
--url http://localhost:8080/videos \
-F 'json={"name": "Cargo.lock"};type=application/json' \
-F file=@./Cargo.lock
```
2024-07-01 02:55:08 +00:00
2024-07-07 19:32:56 +00:00
[`MultipartForm`]: struct@form::MultipartForm
2024-07-01 02:55:08 +00:00
<!-- cargo - rdme end -->
[More available in the examples repo → ](https://github.com/actix/examples/tree/master/forms/multipart )