From 7cb7aa914688f05993efd6c3fed12bc8ede64380 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Thu, 20 Oct 2022 10:19:44 +0200 Subject: Check if a filename already exists and so re-executes the random filename --- src/files.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/files.rs b/src/files.rs index 380c3bf..cf185a2 100644 --- a/src/files.rs +++ b/src/files.rs @@ -3,7 +3,7 @@ use axum::{ extract::{Multipart, Path}, http::header::{HeaderMap, HeaderName, HeaderValue}, }; -use std::fs; +use std::{fs, path}; use rand::random; @@ -29,19 +29,28 @@ pub async fn upload( .iter() .any(|&x| x.to_lowercase() == ext_name) { - let name = match filename { + let mut name = match filename { Some(name) => name, None => (random::() * 1000000000 as f32).to_string(), }; - let save_filename = format!("{}/{}.{}", CONFIG.save_file_base_path, name, ext_name); - uploaded_file = format!("{}/{}.{}", CONFIG.uploads_endpoint, name, ext_name); + loop { + let save_filename = format!("{}/{}.{}", CONFIG.save_file_base_path, name, ext_name); - let data = file.bytes().await.unwrap(); + if path::Path::exists(&path::Path::new(&save_filename)) { + name = (random::() * 1000000000 as f32).to_string(); + continue; + } - tokio::fs::write(&save_filename, &data) - .await - .map_err(|err| err.to_string())?; + uploaded_file = format!("{}/{}.{}", CONFIG.uploads_endpoint, name, ext_name); + + let data = file.bytes().await.unwrap(); + + tokio::fs::write(&save_filename, &data) + .await + .map_err(|err| err.to_string())?; + break; + } } } -- cgit v1.2.3-71-g8e6c