From 67a444c0f27406db88eb156b443ce5de7ebd7059 Mon Sep 17 00:00:00 2001 From: MartinBraquet Date: Thu, 31 Jul 2025 16:31:19 +0200 Subject: [PATCH] Fix file upload --- app/api/upload/route.ts | 79 +++++++++++++++-------------------- app/complete-profile/page.tsx | 6 +-- 2 files changed, 36 insertions(+), 49 deletions(-) diff --git a/app/api/upload/route.ts b/app/api/upload/route.ts index 5fb4ad9c..75071e76 100644 --- a/app/api/upload/route.ts +++ b/app/api/upload/route.ts @@ -21,60 +21,49 @@ export async function POST(request: Request) { const formData = await request.formData(); console.log('formData', formData); - let files = formData.get('files') as File | null | File[]; + const file = formData.get('file') as File | null; - if (files?.name) { - files = [files]; + if (!file) return NextResponse.json({error: 'No file provided'}, {status: 400}); + + // Validate file type + if (!file.type.startsWith('image/')) { + return NextResponse.json({error: 'Only image files are allowed'}, {status: 400}); } - const results = await Promise.all( - files.map(async (file) => { - if (!file) { - return NextResponse.json({error: 'No file provided'}, {status: 400}); - } + // Validate file size (5MB max) + if (file.size > 5 * 1024 * 1024) { + return NextResponse.json({error: 'File size must be less than 5MB'}, {status: 400}); + } - // Validate file type - if (!file.type.startsWith('image/')) { - return NextResponse.json({error: 'Only image files are allowed'}, {status: 400}); - } + const fileExtension = file.name.split('.').pop(); + const fileName = `${uuidv4()}.${fileExtension}`; + const fileBuffer = await file.arrayBuffer(); + const key = `profile-pictures/${fileName}`; - // Validate file size (5MB max) - if (file.size > 5 * 1024 * 1024) { - return NextResponse.json({error: 'File size must be less than 5MB'}, {status: 400}); - } + const uploadParams = { + Bucket: process.env.AWS_S3_BUCKET_NAME!, + Key: key, + Body: Buffer.from(fileBuffer), + ContentType: file.type, + }; - const fileExtension = file.name.split('.').pop(); - const fileName = `${uuidv4()}.${fileExtension}`; - const fileBuffer = await file.arrayBuffer(); - const key = `profile-pictures/${fileName}`; + const response = await s3Client.send(new PutObjectCommand(uploadParams)); + console.log(`Response: ${response}`); - const uploadParams = { - Bucket: process.env.AWS_S3_BUCKET_NAME!, - Key: key, - Body: Buffer.from(fileBuffer), - ContentType: file.type, - }; - - const response = await s3Client.send(new PutObjectCommand(uploadParams)); - console.log(`Response: ${response}`); - - // get signed url - const url = await getSignedUrl( - s3Client, - new GetObjectCommand({ - Bucket: process.env.AWS_S3_BUCKET_NAME!, - Key: key, - }), - {expiresIn: 300} // 5 minutes - ); - - console.log(`Signed URL: ${url}`); - // const fileUrl = `${process.env.AWS_S3_BUCKET_NAME}/profile-pictures/${fileName}`; - return {url: url, key: key}; - }) + // get signed url + const url = await getSignedUrl( + s3Client, + new GetObjectCommand({ + Bucket: process.env.AWS_S3_BUCKET_NAME!, + Key: key, + }), + {expiresIn: 300} // 5 minutes ); - return NextResponse.json(results); + console.log(`Signed URL: ${url}`); + // const fileUrl = `${process.env.AWS_S3_BUCKET_NAME}/profile-pictures/${fileName}`; + + return NextResponse.json({url: url, key: key}); } catch (error) { console.error('Upload error:', error); return NextResponse.json( diff --git a/app/complete-profile/page.tsx b/app/complete-profile/page.tsx index c6850558..c4f7c0b7 100644 --- a/app/complete-profile/page.tsx +++ b/app/complete-profile/page.tsx @@ -147,7 +147,7 @@ function RegisterComponent() { } const formData = new FormData(); - formData.append('files', file); + formData.append('file', file); try { setIsUploading(true); @@ -164,9 +164,7 @@ function RegisterComponent() { return; } - const results = await response.json(); - - const {url, key} = results[0] + const {url, key} = await response.json(); if (headShot) { setImage(url); setKey(key);