Expand description
File upload support for modo applications.
Provides multipart form parsing, in-memory buffering, pluggable storage
backends, and file validation. The #[derive(FromMultipart)]
macro generates the boilerplate for mapping multipart fields to struct fields.
§Features
local(default) — local filesystem storage viastorage::local::LocalStorage.opendal— S3-compatible object storage viastorage::opendal::OpendalStorageand theS3Configconfiguration type.
§Quick start
Define a form struct, register the storage backend as a service, then extract the form in a handler:
ⓘ
use std::sync::Arc;
use modo::{AppConfig, Json, JsonResult, Service};
use modo_upload::{FileStorageDyn, FromMultipart, MultipartForm, UploadConfig, UploadedFile, storage};
use serde::Deserialize;
#[derive(Default, Deserialize)]
struct AppSettings {
#[serde(flatten)]
core: AppConfig,
#[serde(default)]
upload: UploadConfig,
}
#[derive(FromMultipart)]
struct UploadForm {
#[upload(max_size = "5mb", accept = "image/*")]
avatar: UploadedFile,
name: String,
}
#[modo::handler(POST, "/upload")]
async fn upload(
file_storage: Service<Arc<dyn FileStorageDyn>>,
form: MultipartForm<UploadForm>,
) -> JsonResult<()> {
let stored = file_storage.store("avatars", &form.avatar).await?;
println!("stored at {}", stored.path);
Ok(Json(()))
}
#[modo::main]
async fn main(
app: modo::app::AppBuilder,
config: AppSettings,
) -> Result<(), Box<dyn std::error::Error>> {
let file_storage = storage(&config.upload)?;
app.config(config.core).service(file_storage).run().await
}Re-exports§
pub use storage::FileStorage;pub use storage::FileStorageDyn;pub use storage::FileStorageSend;pub use storage::StoredFile;pub use storage::storage;
Modules§
- storage
- Pluggable storage backends for persisted file uploads.
Structs§
- Buffered
Upload - An uploaded file fully buffered in memory as a sequence of chunks.
- Multipart
Form - Axum extractor that parses
multipart/form-data, auto-sanitizes text fields, and exposes optional field-level validation. - Upload
Config - Upload configuration, deserialized from YAML via
modo::config::load(). - Uploaded
File - An uploaded file fully buffered in memory as a single contiguous buffer.
Enums§
- Storage
Backend - Storage backend selector.
Traits§
- From
Multipart - Trait for parsing a struct from
multipart/form-data.
Functions§
Derive Macros§
- From
Multipart - Derive macro for parsing
multipart/form-datainto a struct.