Skip to content

Commit f64c4cb

Browse files
authored
fix: pdf preview base64 too large to preview (#1031)
1 parent 35dc171 commit f64c4cb

File tree

3 files changed

+11
-29
lines changed

3 files changed

+11
-29
lines changed

apps/nextjs-app/next.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ const secureHeaders = createSecureHeaders({
8888
'https://*.teable.io',
8989
'https://*.teable.cn',
9090
],
91-
frameSrc: ["'self'", 'data:'],
91+
frameSrc: ["'self'", 'blob:'],
9292
connectSrc: [
9393
"'self'",
9494
'https://*.sentry.io',

packages/ui-lib/src/base/file/preview/pdf/PDFPreview.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@ import React, { useState, useEffect } from 'react';
22
import { Skeleton } from '../../../../shadcn';
33
import { Spin } from '../../../spin/Spin';
44
import type { IFileItemInner } from '../FilePreviewContext';
5-
import { urlToBase64 } from './utils';
5+
import { getBlobUrlFromUrl } from './utils';
66

77
interface IPdfPreviewProps extends IFileItemInner {}
88

99
export const PDFPreview = (props: IPdfPreviewProps) => {
10-
const [base64, setBase64] = useState('');
10+
const [blobUrl, setBlobUrl] = useState('');
1111

1212
useEffect(() => {
13-
urlToBase64(props.src).then((res) => {
14-
setBase64(res.base64WithPrefix);
13+
getBlobUrlFromUrl(props.src).then((res) => {
14+
setBlobUrl(res);
1515
});
1616
}, [props.src]);
1717

18-
return base64 ? (
18+
return blobUrl ? (
1919
<iframe
20-
src={base64}
20+
src={blobUrl}
2121
width="100%"
2222
height="100%"
2323
title="PDF Viewer"
Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,6 @@
1-
export const urlToBase64 = async (
2-
url: string
3-
): Promise<{ base64: string; base64WithPrefix: string }> => {
4-
try {
5-
const response = await fetch(url);
6-
const blob = await response.blob();
1+
import { getBlobFromUrl } from '../office/utils';
72

8-
return new Promise((resolve, reject) => {
9-
const reader = new FileReader();
10-
reader.onloadend = () => {
11-
const base64String = String(reader.result);
12-
base64String &&
13-
resolve({
14-
base64: base64String.split(',')[1],
15-
base64WithPrefix: base64String,
16-
});
17-
};
18-
reader.onerror = reject;
19-
reader.readAsDataURL(blob);
20-
});
21-
} catch (error) {
22-
throw new Error(`Failed to convert URL to base64: ${(error as Error)?.message}`);
23-
}
3+
export const getBlobUrlFromUrl = async (url: string) => {
4+
const blob = await getBlobFromUrl(url);
5+
return URL.createObjectURL(blob);
246
};

0 commit comments

Comments
 (0)