show PDFs in BlobPreview, add ?inline query param to /raw/
parent
538ccc27ec
commit
19b25666c6
|
@ -11,6 +11,7 @@ use actix_files::NamedFile;
|
|||
use actix_multipart::Multipart;
|
||||
use actix_web::error::{ErrorBadRequest, ErrorInternalServerError, ErrorNotFound};
|
||||
use actix_web::http;
|
||||
use actix_web::http::header::{ContentDisposition, DispositionType};
|
||||
use actix_web::{delete, error, get, post, put, web, Either, Error, HttpResponse};
|
||||
use anyhow::{anyhow, Result};
|
||||
use futures_util::TryStreamExt;
|
||||
|
@ -42,6 +43,7 @@ pub struct State {
|
|||
#[derive(Deserialize)]
|
||||
pub struct RawRequest {
|
||||
native: Option<String>,
|
||||
inline: Option<String>,
|
||||
}
|
||||
|
||||
#[get("/api/raw/{hash}")]
|
||||
|
@ -50,8 +52,9 @@ pub async fn get_raw(
|
|||
web::Query(query): web::Query<RawRequest>,
|
||||
hash: web::Path<String>,
|
||||
) -> Result<Either<NamedFile, HttpResponse>, Error> {
|
||||
let address = Address::decode(&b58_decode(hash.into_inner()).map_err(ErrorInternalServerError)?)
|
||||
.map_err(ErrorInternalServerError)?;
|
||||
let address =
|
||||
Address::decode(&b58_decode(hash.into_inner()).map_err(ErrorInternalServerError)?)
|
||||
.map_err(ErrorInternalServerError)?;
|
||||
if let Address::Hash(hash) = address {
|
||||
let connection = state.upend.connection().map_err(ErrorInternalServerError)?;
|
||||
|
||||
|
@ -71,7 +74,14 @@ pub async fn get_raw(
|
|||
let file_path = state.upend.vault_path.join(&file.path);
|
||||
|
||||
if query.native.is_none() {
|
||||
Ok(Either::A(NamedFile::open(file_path)?))
|
||||
Ok(Either::A(if query.inline.is_some() {
|
||||
NamedFile::open(file_path)?.set_content_disposition(ContentDisposition {
|
||||
disposition: DispositionType::Inline,
|
||||
parameters: vec![],
|
||||
})
|
||||
} else {
|
||||
NamedFile::open(file_path)?
|
||||
}))
|
||||
} else if state.desktop_enabled {
|
||||
#[cfg(feature = "desktop")]
|
||||
{
|
||||
|
@ -370,8 +380,9 @@ pub async fn get_file(
|
|||
state: web::Data<State>,
|
||||
hash: web::Path<String>,
|
||||
) -> Result<HttpResponse, Error> {
|
||||
let address = Address::decode(&b58_decode(hash.into_inner()).map_err(ErrorInternalServerError)?)
|
||||
.map_err(ErrorInternalServerError)?;
|
||||
let address =
|
||||
Address::decode(&b58_decode(hash.into_inner()).map_err(ErrorInternalServerError)?)
|
||||
.map_err(ErrorInternalServerError)?;
|
||||
|
||||
if let Address::Hash(hash) = address {
|
||||
let connection = state.upend.connection().map_err(ErrorInternalServerError)?;
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
$: mimeType = String($entity?.get("FILE_MIME"));
|
||||
$: handled =
|
||||
Boolean(mimeType) &&
|
||||
["audio", "video", "image", "model", "text"].some((prefix) =>
|
||||
mimeType.startsWith(prefix)
|
||||
["audio", "video", "image", "model", "text", "application/pdf"].some(
|
||||
(prefix) => mimeType.startsWith(prefix)
|
||||
);
|
||||
|
||||
let imageLoaded = null;
|
||||
|
@ -48,6 +48,9 @@
|
|||
/>
|
||||
</a>
|
||||
{/if}
|
||||
{#if mimeType == "application/pdf"}
|
||||
<iframe src="/api/raw/{address}?inline" title="PDF document of {address}"/>
|
||||
{/if}
|
||||
{#if mimeType?.startsWith("model")}
|
||||
<ModelViewer src="/api/raw/{address}" />
|
||||
{/if}
|
||||
|
@ -69,6 +72,11 @@
|
|||
max-height: 25em;
|
||||
}
|
||||
|
||||
iframe {
|
||||
width: 100%;
|
||||
min-height: 25em;
|
||||
}
|
||||
|
||||
.text {
|
||||
display: flex;
|
||||
margin-bottom: 1rem;
|
||||
|
|
Loading…
Reference in New Issue