diff --git a/server/api/files/proxy-preview.ts b/server/api/files/proxy-preview.ts index 37bb0ed..0a84e18 100644 --- a/server/api/files/proxy-preview.ts +++ b/server/api/files/proxy-preview.ts @@ -6,6 +6,8 @@ export default defineEventHandler(async (event) => { const query = getQuery(event); const fileName = query.fileName as string; + console.log('Proxy preview requested for:', fileName); + if (!fileName) { throw createError({ statusCode: 400, @@ -15,12 +17,15 @@ export default defineEventHandler(async (event) => { // Get content type const contentType = mime.lookup(fileName) || 'application/octet-stream'; + console.log('Content type:', contentType); // Get the download URL const url = await getDownloadUrl(fileName); + console.log('MinIO URL obtained'); // Fetch the file content from MinIO const response = await fetch(url); + console.log('MinIO response status:', response.status); if (!response.ok) { throw createError({ @@ -29,15 +34,26 @@ export default defineEventHandler(async (event) => { }); } - // Get the file buffer - const buffer = Buffer.from(await response.arrayBuffer()); + // Get the file data as ArrayBuffer + const arrayBuffer = await response.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + + console.log('File size:', buffer.length, 'bytes'); // Set appropriate headers for preview setHeader(event, 'Content-Type', contentType); - setHeader(event, 'Content-Disposition', 'inline'); + setHeader(event, 'Content-Disposition', `inline; filename="${fileName.split('/').pop()}"`); setHeader(event, 'Cache-Control', 'public, max-age=3600'); + setHeader(event, 'Content-Length', String(buffer.length)); - // Return the file buffer + // For PDF files, add additional headers + if (contentType === 'application/pdf') { + setHeader(event, 'X-Content-Type-Options', 'nosniff'); + } + + console.log('Returning buffer for preview'); + + // Return the buffer directly - Nitro will handle it properly return buffer; } catch (error: any) { console.error('Failed to proxy preview:', error);