61 lines
1.9 KiB
Rust
61 lines
1.9 KiB
Rust
|
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())
|
||
|
}
|