50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
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;
|
|
|
|
if (!fileName) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: 'File name is required',
|
|
});
|
|
}
|
|
|
|
// Get content type
|
|
const contentType = mime.lookup(fileName) || 'application/octet-stream';
|
|
|
|
// Get the download URL
|
|
const url = await getDownloadUrl(fileName);
|
|
|
|
// Fetch the file content from MinIO
|
|
const response = await fetch(url);
|
|
|
|
if (!response.ok) {
|
|
throw createError({
|
|
statusCode: response.status,
|
|
statusMessage: 'Failed to fetch file from storage',
|
|
});
|
|
}
|
|
|
|
// Get the file buffer
|
|
const buffer = Buffer.from(await response.arrayBuffer());
|
|
|
|
// Set appropriate headers for preview
|
|
setHeader(event, 'Content-Type', contentType);
|
|
setHeader(event, 'Content-Disposition', 'inline');
|
|
setHeader(event, 'Cache-Control', 'public, max-age=3600');
|
|
|
|
// Return the file buffer
|
|
return buffer;
|
|
} catch (error: any) {
|
|
console.error('Failed to proxy preview:', error);
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: error.message || 'Failed to proxy preview',
|
|
});
|
|
}
|
|
});
|