always prefer inline display when not downloading

This commit is contained in:
neri 2021-08-15 23:23:03 +02:00
parent b66b34208c
commit 31a429861d
1 changed files with 12 additions and 19 deletions

View File

@ -45,7 +45,7 @@ pub async fn download(
path.push(&file_id); path.push(&file_id);
let download = delete_on_download || req.query_string().contains("dl"); let download = delete_on_download || req.query_string().contains("dl");
let (content_type, mut content_disposition) = get_content_types(&path, &file_name); let content_type = get_content_type(&path);
let is_text = file_kind == FileKind::Text.to_string() || content_type.type_() == mime::TEXT; let is_text = file_kind == FileKind::Text.to_string() || content_type.type_() == mime::TEXT;
let response = if is_text && !download { let response = if is_text && !download {
let content = fs::read_to_string(path).await.map_err(|file_err| { let content = fs::read_to_string(path).await.map_err(|file_err| {
@ -57,9 +57,14 @@ pub async fn download(
let response = HttpResponse::Ok().content_type("text/html").body(view_html); let response = HttpResponse::Ok().content_type("text/html").body(view_html);
Ok(response) Ok(response)
} else { } else {
if download { let content_disposition = ContentDisposition {
content_disposition.disposition = DispositionType::Attachment; disposition: if download {
} DispositionType::Attachment
} else {
DispositionType::Inline
},
parameters: get_disposition_params(&file_name),
};
let file = NamedFile::open(path) let file = NamedFile::open(path)
.map_err(|file_err| { .map_err(|file_err| {
log::error!("file could not be read {:?}", file_err); log::error!("file could not be read {:?}", file_err);
@ -80,24 +85,12 @@ pub async fn download(
response response
} }
fn get_content_types(path: &Path, filename: &str) -> (Mime, ContentDisposition) { fn get_content_type(path: &Path) -> Mime {
let std_path = std::path::Path::new(path.as_os_str()); let std_path = std::path::Path::new(path.as_os_str());
let ct = tree_magic_mini::from_filepath(std_path) tree_magic_mini::from_filepath(std_path)
.unwrap_or("application/octet-stream") .unwrap_or("application/octet-stream")
.parse::<Mime>() .parse::<Mime>()
.expect("tree_magic_mini should not produce invalid mime"); .expect("tree_magic_mini should not produce invalid mime")
let disposition = match ct.type_() {
mime::IMAGE | mime::TEXT | mime::AUDIO | mime::VIDEO => DispositionType::Inline,
_ => DispositionType::Attachment,
};
let cd = ContentDisposition {
disposition,
parameters: get_disposition_params(filename),
};
(ct, cd)
} }
fn get_disposition_params(filename: &str) -> Vec<DispositionParam> { fn get_disposition_params(filename: &str) -> Vec<DispositionParam> {