diff options
| author | Santo Cariotti <santo@dcariotti.me> | 2022-09-10 15:23:02 +0000 |
|---|---|---|
| committer | Santo Cariotti <santo@dcariotti.me> | 2022-09-10 15:23:02 +0000 |
| commit | 2a90d0ff8d4336850a450f749140e2df2e94fc56 (patch) | |
| tree | cf6a0d94ad7f56068093a836d302cdc090747d3a /src/files.rs | |
| parent | 58d6870c33d664157c3efc9c75686e6c0779a96f (diff) | |
Upload files
Diffstat (limited to 'src/files.rs')
| -rw-r--r-- | src/files.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/files.rs b/src/files.rs new file mode 100644 index 0000000..63b8eec --- /dev/null +++ b/src/files.rs @@ -0,0 +1,44 @@ +use crate::config::SAVE_FILE_BASE_PATH; +use crate::errors::AppError; +use axum::extract::Multipart; + +use rand::random; + +/// Upload a file. Returns an `AppError` or the path of the uploaded file +pub async fn upload( + mut multipart: Multipart, + allowed_extensions: Vec<&str>, +) -> Result<String, AppError> { + let mut save_filename = String::new(); + + if let Some(file) = multipart.next_field().await.unwrap() { + let content_type = file.content_type().unwrap().to_string(); + + let index = content_type + .find("/") + .map(|i| i) + .unwrap_or(usize::max_value()); + let mut ext_name = "xxx"; + if index != usize::max_value() { + ext_name = &content_type[index + 1..]; + } + + if allowed_extensions + .iter() + .position(|&x| x.to_lowercase() == ext_name) + .is_some() + { + let rnd = (random::<f32>() * 1000000000 as f32) as i32; + + save_filename = format!("{}/{}.{}", SAVE_FILE_BASE_PATH, rnd, ext_name); + + let data = file.bytes().await.unwrap(); + + tokio::fs::write(&save_filename, &data) + .await + .map_err(|err| err.to_string())?; + } + } + + Ok(save_filename) +} |
