Skip to content

Commit

Permalink
Add an example to download a file
Browse files Browse the repository at this point in the history
This new example demonstrates how to download an object and store its
content into a file.
  • Loading branch information
Jean Sainctavit committed Jan 13, 2025
1 parent c642843 commit b97b2f6
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,9 @@ quickcheck = "1.0.3"
[[example]]
name = "file_uploader"

[[example]]
name = "file_downloader"

[[example]]
name = "object_prompt"

4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ Run the examples from the command line with:
* [Upload a file to MinIO](examples/file_uploader)
* [Upload a file to MinIO with CLI](examples/put_object)

### file_downloader.rs

* [Download af file from MinIO](examples/file_downloader.rs)

### object_prompt.rs

* [Prompt a file on MinIO](examples/object_prompt)
Expand Down
75 changes: 75 additions & 0 deletions examples/file_downloader.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
use minio::s3::client::ClientBuilder;
use minio::s3::creds::StaticProvider;
use minio::s3::http::BaseUrl;
use minio::s3::types::S3Api;
use std::path::Path;
use minio::s3::args::{BucketExistsArgs, MakeBucketArgs};
use minio::s3::builders::ObjectContent;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
env_logger::init(); // Note: set environment variable RUST_LOG="INFO" to log info and higher

let base_url = "https://play.min.io".parse::<BaseUrl>()?;
log::info!("Trying to connect to MinIO at: `{:?}`", base_url);

let static_provider = StaticProvider::new(
"Q3AM3UQ867SPQQA43P2F",
"zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG",
None,
);

let client = ClientBuilder::new(base_url.clone())
.provider(Some(Box::new(static_provider)))
.build()?;

let bucket_name: &str = "file-download-rust-bucket";
let object_name: &str = "cat.png";

// File we are going to upload to the bucket
let filename: &Path = Path::new("./examples/cat.png");
let download_path: &str = &format!("/tmp/downloads/{object_name}");

// Check 'bucket_name' bucket exist or not.
let exists: bool = client
.bucket_exists(&BucketExistsArgs::new(bucket_name).unwrap())
.await
.unwrap();

// Make 'bucket_name' bucket if not exist.
if !exists {
client
.make_bucket(&MakeBucketArgs::new(bucket_name).unwrap())
.await
.unwrap();
}

if filename.exists() {
log::info!("File '{}' exists.", &filename.to_str().unwrap());
} else {
log::error!("File '{}' does not exist.", &filename.to_str().unwrap());
return Ok(());
}

let content = ObjectContent::from(filename);
client
.put_object_content(bucket_name, object_name, content)
.send()
.await?;

log::info!(
"file '{}' is successfully uploaded as object '{object_name}' to bucket '{bucket_name}'.",
filename.display()
);

let get_object = client.get_object(bucket_name, object_name).send().await?;

get_object
.content
.to_file(&Path::new(download_path))
.await?;

log::info!("Object '{object_name}' is successfully downloaded to file '{download_path}'.");

Ok(())
}

0 comments on commit b97b2f6

Please sign in to comment.