Skip to content

storage

Object storage (local / memory / S3 / GCS / Azure) · crate sova-storage 0.1.0 · id storage

bash
cargo add sova --features storage,storage-azure,storage-gcs,storage-memory,storage-s3
FeatureWhat you get
storageObject storage (sova_storage).
storage-azureAzure Blob backend.
storage-gcsGoogle Cloud Storage backend.
storage-memoryIn-memory blob store (tests).
storage-s3S3 / R2 / MinIO backend.

Object storage for Sova — local disk, memory, S3/R2/MinIO, GCS, Azure.

Upload pipeline:

rust
 file.validate(&UploadRules::new().max_bytes(2_000_000).extensions(["png", "jpg"]))?;
 let stored = req.storage().store(&file, "avatars").await?;
 // stored.key / stored.url

Usage

Object storage for uploads. Add on the web preset (multipart feature for files):

rust
use sova::prelude::*;
use sova::{Parser, Redirect, Request, ServerArgs, Storage, UploadRules};

#[tokio::main]
async fn main() -> Result<()> {
    let args = ServerArgs::parse();
    args.init_tracing();

    let mut app = App::web()
        .site("Uploads")
        .public_url("http://127.0.0.1:3000")
        .into_app();

    app.install(Storage::local("public/uploads"));

    app.post("/avatar", avatar);
    app.run().await
}

async fn avatar(mut req: Request) -> Result<Redirect> {
    let data = req.input().await?;
    let file = data
        .file("avatar")
        .cloned()
        .ok_or_else(|| Error::bad_request("avatar required"))?;
    file.validate(
        &UploadRules::new()
            .max_bytes(2_000_000)
            .extensions(["png", "jpg", "webp"]),
    )?;
    let _stored = req.storage().store(&file, "avatars").await?;
    Ok(Redirect::see_other("/"))
}
bash
cargo run -p upload
cargo run -p storage_demo