63 lines
2.2 KiB
TypeScript
63 lines
2.2 KiB
TypeScript
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' });
|
||
}
|
||
});
|