diff --git a/multipart-s3/.env.example b/multipart-s3/.env.example new file mode 100644 index 00000000..92483c4a --- /dev/null +++ b/multipart-s3/.env.example @@ -0,0 +1,3 @@ +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_S3_BUCKET_NAME= \ No newline at end of file diff --git a/multipart-s3/Cargo.toml b/multipart-s3/Cargo.toml index 5cd946c9..940f300a 100644 --- a/multipart-s3/Cargo.toml +++ b/multipart-s3/Cargo.toml @@ -16,4 +16,5 @@ rusoto_core = "0.42.0" bytes = { version = "0.5", features = ["serde"] } serde = { version = "1.0.104", features=["derive"] } serde_json = "1.0" -serde-value = "0.6.0" \ No newline at end of file +serde-value = "0.6.0" +dotenv = "0.15.0" \ No newline at end of file diff --git a/multipart-s3/README.md b/multipart-s3/README.md index 06f72e41..4ce80f88 100644 --- a/multipart-s3/README.md +++ b/multipart-s3/README.md @@ -1,5 +1,8 @@ use : https://github.com/rusoto/rusoto +https://www.rusoto.org/regions.html +https://docs.rs/rusoto_core/0.42.0/rusoto_core/enum.Region.html + 1. set env AWS_ACCESS_KEY_ID 2. set env AWS_SECRET_ACCESS_KEY 3. set env AWS_S3_BUCKET_NAME diff --git a/multipart-s3/src/main.rs b/multipart-s3/src/main.rs index ffee92df..31e9db34 100644 --- a/multipart-s3/src/main.rs +++ b/multipart-s3/src/main.rs @@ -1,16 +1,19 @@ use std::io::Write; - +extern crate dotenv; use actix_multipart::Multipart; use actix_web::{middleware, web, App, Error, HttpResponse, HttpServer}; +use dotenv::dotenv; use futures::StreamExt; mod utils; use std::borrow::BorrowMut; +use std::env; use utils::upload::{ delete_object, save_file as upload_save_file, split_payload, UplodFile, }; extern crate rusoto_core; extern crate rusoto_s3; + mod model { use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize, Debug)] @@ -19,6 +22,7 @@ mod model { pub number: i32, } } + async fn save_file(mut payload: Multipart) -> Result { let pl = split_payload(payload.borrow_mut()).await; println!("bytes={:#?}", pl.0); @@ -79,10 +83,19 @@ fn index() -> HttpResponse { #[actix_rt::main] async fn main() -> std::io::Result<()> { + dotenv().ok(); + let AWS_ACCESS_KEY_ID = + env::var("AWS_ACCESS_KEY_ID").expect("DATABASE_URL must be set"); + let AWS_SECRET_ACCESS_KEY = + env::var("AWS_SECRET_ACCESS_KEY").expect("AWS_SECRET_ACCESS_KEY must be set"); + let AWS_S3_BUCKET_NAME = + env::var("AWS_S3_BUCKET_NAME").expect("AWS_S3_BUCKET_NAME must be set"); + + println!("{}", AWS_ACCESS_KEY_ID); + println!("{}", AWS_SECRET_ACCESS_KEY); + println!("{}", AWS_S3_BUCKET_NAME); + std::env::set_var("RUST_LOG", "actix_server=info,actix_web=info"); - std::env::set_var("AWS_ACCESS_KEY_ID", "your_key"); - std::env::set_var("AWS_SECRET_ACCESS_KEY", "your_key"); - std::env::set_var("AWS_S3_BUCKET_NAME", "your_key"); std::fs::create_dir_all("./tmp").unwrap(); let ip = "0.0.0.0:3000"; diff --git a/multipart-s3/src/utils/upload.rs b/multipart-s3/src/utils/upload.rs index fa29a262..9c3e7387 100644 --- a/multipart-s3/src/utils/upload.rs +++ b/multipart-s3/src/utils/upload.rs @@ -77,20 +77,24 @@ pub async fn split_payload(payload: &mut Multipart) -> (bytes::Bytes, Vec { + let tmp_file = Tmpfile::new(filename); + let tmp_path = tmp_file.tmp_path.clone(); + let mut f = web::block(move || std::fs::File::create(&tmp_path)) .await .unwrap(); + while let Some(chunk) = field.next().await { + let data = chunk.unwrap(); + f = web::block(move || f.write_all(&data).map(|_| f)) + .await + .unwrap(); + } + tmp_files.push(tmp_file.clone()); + } + None => { + println!("file none"); } - tmp_files.push(tmp_file.clone()); } } }