Files
go_nuxt_admin/server/api/optimize.post.ts
Beyhan Oğur 5285a0dd86 first commit
2026-04-26 22:07:47 +03:00

63 lines
2.2 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import sharp from 'sharp';
export default defineEventHandler(async (event) => {
const files = await readMultipartFormData(event);
if (!files || files.length === 0) {
throw createError({ statusCode: 400, statusMessage: 'Dosya yüklenmedi' });
}
// Dosyayı bul (adı 'file' olan)
const file = files.find(f => f.name === 'file');
if (!file || !file.filename) {
throw createError({ statusCode: 400, statusMessage: 'Geçersiz dosya' });
}
// Form alanlarından parametreleri al
const getField = (name: string) => {
const field = files.find(f => f.name === name);
return field ? field.data.toString() : null;
};
const format = getField('format') || 'avif';
const quality = parseInt(getField('quality') || '85', 10);
const width = getField('width') ? parseInt(getField('width')!, 10) : null;
const height = getField('height') ? parseInt(getField('height')!, 10) : null;
try {
let pipeline = sharp(file.data);
// Resize işlemi (en veya boy varsa)
if (width || height) {
pipeline = pipeline.resize(width, height, { fit: 'cover' });
}
// Format ve kalite ayarı
if (format === 'avif') {
pipeline = pipeline.avif({ quality });
} else if (format === 'webp') {
pipeline = pipeline.webp({ quality });
} else if (format === 'png') {
pipeline = pipeline.png({ quality });
} else if (format === 'jpeg' || format === 'jpg') {
pipeline = pipeline.jpeg({ quality });
} else {
// Varsayılan avif
pipeline = pipeline.avif({ quality });
}
const optimizedBuffer = await pipeline.toBuffer();
// Content-Type i ayarla
let contentType = 'image/avif';
if (format === 'webp') contentType = 'image/webp';
if (format === 'png') contentType = 'image/png';
if (format === 'jpeg' || format === 'jpg') contentType = 'image/jpeg';
setResponseHeader(event, 'Content-Type', contentType);
return optimizedBuffer;
} catch (error) {
console.error('Resim optimizasyonu hatası:', error);
throw createError({ statusCode: 500, statusMessage: 'Resim optimize edilemedi' });
}
});