Skip to content

Commit c06ded1

Browse files
authored
fix: embed pdf via direct link (#10491)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
1 parent 40fda7b commit c06ded1

File tree

2 files changed

+11
-31
lines changed

2 files changed

+11
-31
lines changed

packages/ui/src/components/EmbeddedPDF.svelte

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,11 @@
1414
-->
1515

1616
<script lang="ts">
17-
import { onDestroy } from 'svelte'
18-
import Loading from './Loading.svelte'
19-
2017
export let src: string
2118
export let name: string
2219
export let fit: boolean = false
2320
export let css: string | undefined = undefined
2421
25-
let iframeSrc: string | undefined = undefined
26-
27-
async function loadFile (src: string): Promise<void> {
28-
if (iframeSrc !== undefined) {
29-
URL.revokeObjectURL(iframeSrc)
30-
iframeSrc = undefined
31-
}
32-
33-
const response = await fetch(src)
34-
const blob = await response.blob()
35-
iframeSrc = URL.createObjectURL(blob)
36-
}
37-
38-
$: void loadFile(src)
39-
4022
let iframe: HTMLIFrameElement | undefined = undefined
4123
4224
// eslint-disable-next-line @typescript-eslint/prefer-optional-chain
@@ -58,19 +40,9 @@
5840
}
5941
}
6042
}
61-
62-
onDestroy(() => {
63-
if (iframeSrc !== undefined) {
64-
URL.revokeObjectURL(iframeSrc)
65-
}
66-
})
6743
</script>
6844

69-
{#if iframeSrc}
70-
<iframe bind:this={iframe} class:fit src={iframeSrc + '#view=FitH&navpanes=0'} title={name} on:load />
71-
{:else}
72-
<Loading />
73-
{/if}
45+
<iframe bind:this={iframe} class:fit src={src + '#view=FitH&navpanes=0'} title={name} on:load />
7446

7547
<style lang="scss">
7648
iframe {

services/datalake/pod-datalake/src/handlers/blob.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import { type Datalake, wrapETag } from '../datalake'
2525
import { getBufferSha256, getFileSha256 } from '../hash'
2626
import { type TemporaryDir } from '../tempdir'
2727

28+
const safeInlineTypes = ['application/pdf', 'image/png', 'image/jpeg', 'image/gif', 'image/webp']
29+
2830
interface BlobParentRequest {
2931
parent: string | null
3032
}
@@ -76,13 +78,16 @@ export async function handleBlobGet (
7678
return
7779
}
7880

81+
const disposition = safeInlineTypes.includes(blob.contentType) ? 'inline' : 'attachment'
82+
7983
res.setHeader('Accept-Ranges', 'bytes')
8084
res.setHeader('Content-Length', blob.bodyLength.toString())
8185
res.setHeader('Content-Type', blob.contentType ?? '')
8286
res.setHeader('Content-Security-Policy', "default-src 'none';")
87+
res.setHeader('X-Content-Type-Options', 'nosniff')
8388
res.setHeader(
8489
'Content-Disposition',
85-
filename !== undefined ? `attachment; filename*=UTF-8''${encodeURIComponent(filename)}` : 'attachment'
90+
filename !== undefined ? `${disposition}; filename*=UTF-8''${encodeURIComponent(filename)}` : disposition
8691
)
8792
res.setHeader('Cache-Control', blob.cacheControl ?? cacheControl)
8893
res.setHeader('Last-Modified', new Date(blob.lastModified).toUTCString())
@@ -131,13 +136,16 @@ export async function handleBlobHead (
131136
return
132137
}
133138

139+
const disposition = safeInlineTypes.includes(head.contentType) ? 'inline' : 'attachment'
140+
134141
res.setHeader('Accept-Ranges', 'bytes')
135142
res.setHeader('Content-Length', head.size.toString())
136143
res.setHeader('Content-Type', head.contentType ?? '')
137144
res.setHeader('Content-Security-Policy', "default-src 'none';")
145+
res.setHeader('X-Content-Type-Options', 'nosniff')
138146
res.setHeader(
139147
'Content-Disposition',
140-
filename !== undefined ? `attachment; filename*=UTF-8''${encodeURIComponent(filename)}` : 'attachment'
148+
filename !== undefined ? `${disposition}; filename*=UTF-8''${encodeURIComponent(filename)}` : disposition
141149
)
142150
res.setHeader('Cache-Control', head.cacheControl ?? cacheControl)
143151
res.setHeader('Last-Modified', new Date(head.lastModified).toUTCString())

0 commit comments

Comments
 (0)