use crate::app_config::AppConfig; use crate::constants; use crate::controllers::HttpResult; use crate::utils::files_utils; use actix_multipart::form::tempfile::TempFile; use actix_multipart::form::MultipartForm; use actix_web::HttpResponse; #[derive(Debug, MultipartForm)] pub struct UploadIsoForm { #[multipart(rename = "file")] files: Vec, } /// Upload iso file pub async fn upload_file(MultipartForm(mut form): MultipartForm) -> HttpResult { if form.files.is_empty() { log::error!("Missing uploaded ISO file!"); return Ok(HttpResponse::BadRequest().json("Missing file!")); } let file = form.files.remove(0); if file.size > constants::ISO_MAX_SIZE { log::error!("Uploaded ISO file is too large!"); return Ok(HttpResponse::BadRequest().json("File is too large!")); } if let Some(m) = &file.content_type { if !constants::ALLOWED_ISO_MIME_TYPES.contains(&m.to_string().as_str()) { log::error!("Uploaded ISO file has an invalid mimetype!"); return Ok(HttpResponse::BadRequest().json("Invalid mimetype!")); } } let file_name = match &file.file_name { None => { log::error!("Uploaded ISO file does not have a name!"); return Ok(HttpResponse::BadRequest().json("Missing file name!")); } Some(f) => f, }; if !files_utils::check_file_name(file_name) { log::error!("Bad file name for uploaded iso!"); return Ok(HttpResponse::BadRequest().json("Bad file name!")); } let dest_file = AppConfig::get().iso_storage_path().join(file_name); log::info!("Will save ISO file {:?}", dest_file); if dest_file.exists() { log::error!("Conflict with uploaded iso file name!"); return Ok(HttpResponse::Conflict().json("The file already exists!")); } file.file.persist(dest_file)?; Ok(HttpResponse::Accepted().finish()) }