feat: stream file serving (#1865)

This commit is contained in:
Philip Okugbe
2026-01-24 17:54:56 +00:00
committed by GitHub
parent efb0a9317b
commit 98f71c95fe
3 changed files with 12 additions and 8 deletions
@@ -181,7 +181,9 @@ export class AttachmentController {
} }
try { try {
const fileStream = await this.storageService.read(attachment.filePath); const fileStream = await this.storageService.readStream(
attachment.filePath,
);
res.headers({ res.headers({
'Content-Type': attachment.mimeType, 'Content-Type': attachment.mimeType,
'Cache-Control': 'private, max-age=3600', 'Cache-Control': 'private, max-age=3600',
@@ -241,7 +243,9 @@ export class AttachmentController {
} }
try { try {
const fileStream = await this.storageService.read(attachment.filePath); const fileStream = await this.storageService.readStream(
attachment.filePath,
);
res.headers({ res.headers({
'Content-Type': attachment.mimeType, 'Content-Type': attachment.mimeType,
'Cache-Control': 'public, max-age=3600', 'Cache-Control': 'public, max-age=3600',
@@ -367,14 +371,14 @@ export class AttachmentController {
const filePath = `${getAttachmentFolderPath(attachmentType, workspace.id)}/${fileName}`; const filePath = `${getAttachmentFolderPath(attachmentType, workspace.id)}/${fileName}`;
try { try {
const fileStream = await this.storageService.read(filePath); const fileStream = await this.storageService.readStream(filePath);
res.headers({ res.headers({
'Content-Type': getMimeType(filePath), 'Content-Type': getMimeType(filePath),
'Cache-Control': 'private, max-age=86400', 'Cache-Control': 'private, max-age=86400',
}); });
return res.send(fileStream); return res.send(fileStream);
} catch (err) { } catch (err) {
// this.logger.error(err); // this.logger.error(err);
throw new NotFoundException('File not found'); throw new NotFoundException('File not found');
} }
} }
@@ -55,7 +55,7 @@ export class ExportController {
throw new ForbiddenException(); throw new ForbiddenException();
} }
const zipFileBuffer = await this.exportService.exportPages( const zipFileStream = await this.exportService.exportPages(
dto.pageId, dto.pageId,
dto.format, dto.format,
dto.includeAttachments, dto.includeAttachments,
@@ -70,7 +70,7 @@ export class ExportController {
'attachment; filename="' + encodeURIComponent(fileName) + '"', 'attachment; filename="' + encodeURIComponent(fileName) + '"',
}); });
res.send(zipFileBuffer); res.send(zipFileStream);
} }
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard)
@@ -100,6 +100,6 @@ export class ExportController {
'"', '"',
}); });
res.send(exportFile.fileBuffer); res.send(exportFile.fileStream);
} }
} }
@@ -177,7 +177,7 @@ export class ExportService {
const fileName = `${space.name}-space-export.zip`; const fileName = `${space.name}-space-export.zip`;
return { return {
fileBuffer: zipFile, fileStream: zipFile,
fileName, fileName,
}; };
} }