diff options
-rw-r--r-- | src/args.rs | 20 | ||||
-rw-r--r-- | src/config.rs | 23 | ||||
-rw-r--r-- | src/renderer.rs | 5 |
3 files changed, 46 insertions, 2 deletions
diff --git a/src/args.rs b/src/args.rs index 841db3a..7667bee 100644 --- a/src/args.rs +++ b/src/args.rs @@ -8,6 +8,13 @@ use crate::auth; use crate::errors::ContextualError; use crate::renderer; +#[derive(clap::ArgEnum, Clone)] +pub enum MediaType { + Image, + Audio, + Video, +} + #[derive(Parser)] #[clap(name = "miniserve", author, about, version)] pub struct CliArgs { @@ -104,6 +111,19 @@ pub struct CliArgs { #[clap(short = 'u', long = "upload-files")] pub file_upload: bool, + /// Specify uploadable media types + #[clap(arg_enum, short = 'm', long = "media-type", requires = "file-upload")] + pub media_type: Option<Vec<MediaType>>, + + /// Directly specify the uploadable media type expression + #[clap( + short = 'M', + long = "raw-media-type", + requires = "file-upload", + conflicts_with = "media-type" + )] + pub media_type_raw: Option<String>, + /// Enable overriding existing files during file upload #[clap(short = 'o', long = "overwrite-files")] pub overwrite_files: bool, diff --git a/src/config.rs b/src/config.rs index 73fcec2..1bb8e08 100644 --- a/src/config.rs +++ b/src/config.rs @@ -13,7 +13,10 @@ use http::HeaderMap; #[cfg(feature = "tls")] use rustls_pemfile as pemfile; -use crate::{args::CliArgs, auth::RequiredAuth}; +use crate::{ + args::{CliArgs, MediaType}, + auth::RequiredAuth, +}; /// Possible characters for random routes const ROUTE_ALPHABET: [char; 16] = [ @@ -81,6 +84,9 @@ pub struct MiniserveConfig { /// Enable file upload pub file_upload: bool, + /// HTML accept attribute value + pub uploadable_media_type: Option<String>, + /// Enable upload to override existing files pub overwrite_files: bool, @@ -188,6 +194,20 @@ impl MiniserveConfig { #[cfg(not(feature = "tls"))] let tls_rustls_server_config = None; + let uploadable_media_type = args.media_type_raw.or_else(|| { + args.media_type.map(|types| { + types + .into_iter() + .map(|t| match t { + MediaType::Audio => "audio/*", + MediaType::Image => "image/*", + MediaType::Video => "video/*", + }) + .collect::<Vec<_>>() + .join(",") + }) + }); + Ok(MiniserveConfig { verbose: args.verbose, path: args.path.unwrap_or_else(|| PathBuf::from(".")), @@ -207,6 +227,7 @@ impl MiniserveConfig { overwrite_files: args.overwrite_files, show_qrcode: args.qrcode, file_upload: args.file_upload, + uploadable_media_type, tar_enabled: args.enable_tar, tar_gz_enabled: args.enable_tar_gz, zip_enabled: args.enable_zip, diff --git a/src/renderer.rs b/src/renderer.rs index ef7285b..c64d459 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -107,7 +107,10 @@ pub fn page( form id="file_submit" action=(upload_action) method="POST" enctype="multipart/form-data" { p { "Select a file to upload or drag it anywhere into the window" } div { - input #file-input type="file" name="file_to_upload" required="" multiple {} + @match &conf.uploadable_media_type { + Some(accept) => {input #file-input accept=(accept) type="file" name="file_to_upload" required="" multiple {}}, + None => {input #file-input type="file" name="file_to_upload" required="" multiple {}} + } button type="submit" { "Upload file" } } } |