Skip to main content

Crate modo_upload

Crate modo_upload 

Source
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 via storage::local::LocalStorage.
  • opendal — S3-compatible object storage via storage::opendal::OpendalStorage and the S3Config configuration 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§

BufferedUpload
An uploaded file fully buffered in memory as a sequence of chunks.
MultipartForm
Axum extractor that parses multipart/form-data, auto-sanitizes text fields, and exposes optional field-level validation.
UploadConfig
Upload configuration, deserialized from YAML via modo::config::load().
UploadedFile
An uploaded file fully buffered in memory as a single contiguous buffer.

Enums§

StorageBackend
Storage backend selector.

Traits§

FromMultipart
Trait for parsing a struct from multipart/form-data.

Functions§

gb
Convert gigabytes to bytes.
kb
Convert kilobytes to bytes.
mb
Convert megabytes to bytes.

Derive Macros§

FromMultipart
Derive macro for parsing multipart/form-data into a struct.