Files
tool-website/app/api/convert/route.ts
2025-05-16 20:55:47 +02:00

70 lines
1.9 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
import sharp from 'sharp'
export async function POST(req: NextRequest) {
try {
const formData = await req.formData()
const file = formData.get('file') as File
const format = formData.get('format') as string
if (!file || !format) {
return NextResponse.json(
{ error: 'File and format are required' },
{ status: 400 }
)
}
const buffer = Buffer.from(await file.arrayBuffer())
let convertedBuffer: Buffer
try {
const sharpInstance = sharp(buffer)
switch (format) {
case 'png':
convertedBuffer = await sharpInstance.png().toBuffer()
break
case 'jpg':
case 'jpeg':
convertedBuffer = await sharpInstance.jpeg().toBuffer()
break
case 'webp':
convertedBuffer = await sharpInstance.webp().toBuffer()
break
case 'gif':
convertedBuffer = await sharpInstance.gif().toBuffer()
break
case 'ico':
convertedBuffer = await sharpInstance
.resize(256, 256, {
fit: 'contain',
background: { r: 0, g: 0, b: 0, alpha: 0 }
})
.png()
.toBuffer()
break
default:
throw new Error('Unsupported format')
}
return new NextResponse(convertedBuffer, {
headers: {
'Content-Type': `image/${format}`,
'Content-Disposition': `attachment; filename="converted.${format}"`,
},
})
} catch (error) {
console.error('Conversion error:', error)
return NextResponse.json(
{ error: 'Error converting image. Make sure the input format is supported.' },
{ status: 500 }
)
}
} catch (error) {
console.error('Server error:', error)
return NextResponse.json(
{ error: 'Server error' },
{ status: 500 }
)
}
}