Set Content-Disposition header for returned images
This commit is contained in:
parent
559d6a7d9e
commit
df367d53c7
4 changed files with 27 additions and 2 deletions
10
Cargo.lock
generated
10
Cargo.lock
generated
|
@ -510,6 +510,7 @@ dependencies = [
|
||||||
"tower",
|
"tower",
|
||||||
"tower-http",
|
"tower-http",
|
||||||
"url",
|
"url",
|
||||||
|
"url-escape",
|
||||||
"uuid",
|
"uuid",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -3412,6 +3413,15 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "url-escape"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "44e0ce4d1246d075ca5abec4b41d33e87a6054d08e2366b63205665e950db218"
|
||||||
|
dependencies = [
|
||||||
|
"percent-encoding",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "utf8parse"
|
name = "utf8parse"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
|
|
|
@ -26,3 +26,4 @@ base64 = "0.22.1"
|
||||||
chrono = "0.4.38"
|
chrono = "0.4.38"
|
||||||
uuid = { version = "1.11.0", features = [ "v4", "serde" ] }
|
uuid = { version = "1.11.0", features = [ "v4", "serde" ] }
|
||||||
image = "0.25.5"
|
image = "0.25.5"
|
||||||
|
url-escape = "0.1.1"
|
||||||
|
|
|
@ -15,7 +15,7 @@ pub struct Image {
|
||||||
pub width: i32,
|
pub width: i32,
|
||||||
pub height: i32,
|
pub height: i32,
|
||||||
pub mime_type: String,
|
pub mime_type: String,
|
||||||
pub original_filename: String,
|
pub original_filename: Option<String>,
|
||||||
pub alt: Option<String>,
|
pub alt: Option<String>,
|
||||||
pub uploaded_at: chrono::DateTime<chrono::Utc>,
|
pub uploaded_at: chrono::DateTime<chrono::Utc>,
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ use std::{
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
};
|
};
|
||||||
use tower_http::services::ServeFile;
|
use tower_http::services::ServeFile;
|
||||||
|
use url_escape;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use super::{AppState, ControllerError};
|
use super::{AppState, ControllerError};
|
||||||
|
@ -95,8 +96,21 @@ pub async fn get_image(
|
||||||
let image_path = get_image_path(image_id);
|
let image_path = get_image_path(image_id);
|
||||||
let db_img = images::get_image(&state.db, image_id).await?;
|
let db_img = images::get_image(&state.db, image_id).await?;
|
||||||
let content = ServeFile::new(image_path).try_call(req).await?;
|
let content = ServeFile::new(image_path).try_call(req).await?;
|
||||||
|
let filename = match db_img.original_filename {
|
||||||
|
Some(filename) => url_escape::encode_fragment(&filename).to_string(),
|
||||||
|
None => image_id.simple().to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
Ok(([(header::CONTENT_TYPE, db_img.mime_type)], content))
|
Ok((
|
||||||
|
[
|
||||||
|
(header::CONTENT_TYPE, db_img.mime_type),
|
||||||
|
(
|
||||||
|
header::CONTENT_DISPOSITION,
|
||||||
|
format!("inline; filename=\"{filename}\""),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
content,
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn delete_image(
|
pub async fn delete_image(
|
||||||
|
|
Loading…
Reference in a new issue