mirror of
https://github.com/fafhrd91/actix-web
synced 2025-06-26 15:07:42 +02:00
actix-multipart: Feature: Add typed multipart form extractor (#2883)
Co-authored-by: Rob Ede <robjtede@icloud.com>
This commit is contained in:
19
actix-multipart-derive/tests/trybuild/all-required.rs
Normal file
19
actix-multipart-derive/tests/trybuild/all-required.rs
Normal file
@ -0,0 +1,19 @@
|
||||
use actix_web::{web, App, Responder};
|
||||
|
||||
use actix_multipart::form::{tempfile::TempFile, text::Text, MultipartForm};
|
||||
|
||||
#[derive(Debug, MultipartForm)]
|
||||
struct ImageUpload {
|
||||
description: Text<String>,
|
||||
timestamp: Text<i64>,
|
||||
image: TempFile,
|
||||
}
|
||||
|
||||
async fn handler(_form: MultipartForm<ImageUpload>) -> impl Responder {
|
||||
"Hello World!"
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() {
|
||||
App::new().default_service(web::to(handler));
|
||||
}
|
16
actix-multipart-derive/tests/trybuild/deny-duplicates.rs
Normal file
16
actix-multipart-derive/tests/trybuild/deny-duplicates.rs
Normal file
@ -0,0 +1,16 @@
|
||||
use actix_web::{web, App, Responder};
|
||||
|
||||
use actix_multipart::form::MultipartForm;
|
||||
|
||||
#[derive(MultipartForm)]
|
||||
#[multipart(duplicate_field = "deny")]
|
||||
struct Form {}
|
||||
|
||||
async fn handler(_form: MultipartForm<Form>) -> impl Responder {
|
||||
"Hello World!"
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() {
|
||||
App::new().default_service(web::to(handler));
|
||||
}
|
7
actix-multipart-derive/tests/trybuild/deny-parse-fail.rs
Normal file
7
actix-multipart-derive/tests/trybuild/deny-parse-fail.rs
Normal file
@ -0,0 +1,7 @@
|
||||
use actix_multipart::form::MultipartForm;
|
||||
|
||||
#[derive(MultipartForm)]
|
||||
#[multipart(duplicate_field = "no")]
|
||||
struct Form {}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,5 @@
|
||||
error: Unknown literal value `no`
|
||||
--> tests/trybuild/deny-parse-fail.rs:4:31
|
||||
|
|
||||
4 | #[multipart(duplicate_field = "no")]
|
||||
| ^^^^
|
16
actix-multipart-derive/tests/trybuild/deny-unknown.rs
Normal file
16
actix-multipart-derive/tests/trybuild/deny-unknown.rs
Normal file
@ -0,0 +1,16 @@
|
||||
use actix_web::{web, App, Responder};
|
||||
|
||||
use actix_multipart::form::MultipartForm;
|
||||
|
||||
#[derive(MultipartForm)]
|
||||
#[multipart(deny_unknown_fields)]
|
||||
struct Form {}
|
||||
|
||||
async fn handler(_form: MultipartForm<Form>) -> impl Responder {
|
||||
"Hello World!"
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() {
|
||||
App::new().default_service(web::to(handler));
|
||||
}
|
18
actix-multipart-derive/tests/trybuild/optional-and-list.rs
Normal file
18
actix-multipart-derive/tests/trybuild/optional-and-list.rs
Normal file
@ -0,0 +1,18 @@
|
||||
use actix_web::{web, App, Responder};
|
||||
|
||||
use actix_multipart::form::{tempfile::TempFile, text::Text, MultipartForm};
|
||||
|
||||
#[derive(MultipartForm)]
|
||||
struct Form {
|
||||
category: Option<Text<String>>,
|
||||
files: Vec<TempFile>,
|
||||
}
|
||||
|
||||
async fn handler(_form: MultipartForm<Form>) -> impl Responder {
|
||||
"Hello World!"
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() {
|
||||
App::new().default_service(web::to(handler));
|
||||
}
|
18
actix-multipart-derive/tests/trybuild/rename.rs
Normal file
18
actix-multipart-derive/tests/trybuild/rename.rs
Normal file
@ -0,0 +1,18 @@
|
||||
use actix_web::{web, App, Responder};
|
||||
|
||||
use actix_multipart::form::{tempfile::TempFile, MultipartForm};
|
||||
|
||||
#[derive(MultipartForm)]
|
||||
struct Form {
|
||||
#[multipart(rename = "files[]")]
|
||||
files: Vec<TempFile>,
|
||||
}
|
||||
|
||||
async fn handler(_form: MultipartForm<Form>) -> impl Responder {
|
||||
"Hello World!"
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() {
|
||||
App::new().default_service(web::to(handler));
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
use actix_multipart::form::{text::Text, MultipartForm};
|
||||
|
||||
#[derive(MultipartForm)]
|
||||
struct Form {
|
||||
#[multipart(limit = "2 bytes")]
|
||||
description: Text<String>,
|
||||
}
|
||||
|
||||
#[derive(MultipartForm)]
|
||||
struct Form2 {
|
||||
#[multipart(limit = "2 megabytes")]
|
||||
description: Text<String>,
|
||||
}
|
||||
|
||||
#[derive(MultipartForm)]
|
||||
struct Form3 {
|
||||
#[multipart(limit = "four meters")]
|
||||
description: Text<String>,
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,17 @@
|
||||
error: Could not parse size limit `2 bytes`: invalid digit found in string
|
||||
--> tests/trybuild/size-limit-parse-fail.rs:6:5
|
||||
|
|
||||
6 | description: Text<String>,
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: Could not parse size limit `2 megabytes`: invalid digit found in string
|
||||
--> tests/trybuild/size-limit-parse-fail.rs:12:5
|
||||
|
|
||||
12 | description: Text<String>,
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: Could not parse size limit `four meters`: invalid digit found in string
|
||||
--> tests/trybuild/size-limit-parse-fail.rs:18:5
|
||||
|
|
||||
18 | description: Text<String>,
|
||||
| ^^^^^^^^^^^
|
21
actix-multipart-derive/tests/trybuild/size-limits.rs
Normal file
21
actix-multipart-derive/tests/trybuild/size-limits.rs
Normal file
@ -0,0 +1,21 @@
|
||||
use actix_web::{web, App, Responder};
|
||||
|
||||
use actix_multipart::form::{tempfile::TempFile, text::Text, MultipartForm};
|
||||
|
||||
#[derive(MultipartForm)]
|
||||
struct Form {
|
||||
#[multipart(limit = "2 KiB")]
|
||||
description: Text<String>,
|
||||
|
||||
#[multipart(limit = "512 MiB")]
|
||||
files: Vec<TempFile>,
|
||||
}
|
||||
|
||||
async fn handler(_form: MultipartForm<Form>) -> impl Responder {
|
||||
"Hello World!"
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() {
|
||||
App::new().default_service(web::to(handler));
|
||||
}
|
Reference in New Issue
Block a user