VirtWeb/virtweb_backend/src/controllers/iso_controller.rs

61 lines
1.9 KiB
Rust
Raw Normal View History

2023-09-05 11:19:25 +00:00
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<TempFile>,
}
/// Upload iso file
pub async fn upload_file(MultipartForm(mut form): MultipartForm<UploadIsoForm>) -> 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())
}