From 8286bcf3a5d4664bbd533dd6d72fef8ae6cf3509 Mon Sep 17 00:00:00 2001 From: euzu Date: Thu, 2 Nov 2023 20:58:49 +0100 Subject: [PATCH] Fixed file download extension problem, file is now downloaded into own folder --- src/api/v1_api.rs | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/api/v1_api.rs b/src/api/v1_api.rs index 5f3d01f7a..af529ad79 100644 --- a/src/api/v1_api.rs +++ b/src/api/v1_api.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use std::fs::File; use std::{fs, io}; +use std::ffi::OsStr; use std::io::{ErrorKind, Write}; use std::path::{Path, PathBuf}; use std::sync::{Arc, Mutex}; @@ -237,26 +238,32 @@ pub(crate) async fn download_file( } match client.get(_url).headers(headers).send().await { Ok(response) => { - let filename_re = Regex::new(r"[^A-Za-z0-9_-]").unwrap(); + let filename_re = Regex::new(r"[^A-Za-z0-9_.-]").unwrap(); let filename = filename_re.replace_all(&unidecode(&req.filename).replace(' ', "_"), "").to_string(); - - let path: PathBuf = [(download.directory.clone().unwrap().as_str()), filename.as_str()].iter().collect(); - let download_id = Uuid::new_v4().to_string(); - let response_download_id = download_id.clone(); - actix_rt::spawn(async move { - let downloads = _app_state.downloads.clone(); - match async_download_file(&download_id, &path, response, downloads.clone()).await { - Ok(_) => { - downloads.lock().unwrap().remove(&download_id); - } - Err(err) => { - downloads.lock().unwrap().remove(&download_id); - let _ = fs::remove_file(&path); - error!("{}", err); - } + let file_stem = Path::new(&filename).file_stem().and_then(OsStr::to_str).unwrap_or(""); + let file_dir: PathBuf = [download.directory.as_ref().unwrap(), file_stem].iter().collect(); + match fs::create_dir_all(&file_dir) { + Ok(_) => { + let path = file_dir.join(filename.as_str()); + let download_id = Uuid::new_v4().to_string(); + let response_download_id = download_id.clone(); + actix_rt::spawn(async move { + let downloads = _app_state.downloads.clone(); + match async_download_file(&download_id, &path, response, downloads.clone()).await { + Ok(_) => { + downloads.lock().unwrap().remove(&download_id); + } + Err(err) => { + downloads.lock().unwrap().remove(&download_id); + let _ = fs::remove_file(&path); + error!("{}", err); + } + } + }); + HttpResponse::Ok().json(json!({"download_id": response_download_id})) } - }); - HttpResponse::Ok().json(json!({"download_id": response_download_id})) + Err(err) => HttpResponse::InternalServerError().json(json!({"error": format!("{}", err)})) + } } Err(err) => HttpResponse::InternalServerError().json(json!({"error": format!("{}", err)})), }