Can upload ISO files
This commit is contained in:
60
virtweb_backend/src/controllers/iso_controller.rs
Normal file
60
virtweb_backend/src/controllers/iso_controller.rs
Normal file
@ -0,0 +1,60 @@
|
||||
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())
|
||||
}
|
Reference in New Issue
Block a user