import { getDownloadUrl } from '~/server/utils/minio'; import mime from 'mime-types'; export default defineEventHandler(async (event) => { try { const query = getQuery(event); const fileName = query.fileName as string; console.log('Proxy preview requested for:', fileName); if (!fileName) { throw createError({ statusCode: 400, statusMessage: 'File name is required', }); } // 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({ statusCode: response.status, statusMessage: 'Failed to fetch file from storage', }); } // 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; filename="${fileName.split('/').pop()}"`); setHeader(event, 'Cache-Control', 'public, max-age=3600'); setHeader(event, 'Content-Length', String(buffer.length)); // 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); throw createError({ statusCode: 500, statusMessage: error.message || 'Failed to proxy preview', }); } });