diff --git a/src/lib/components/forms/updatePFP.svelte b/src/lib/components/forms/updatePFP.svelte index ecb0514..b09fdf4 100644 --- a/src/lib/components/forms/updatePFP.svelte +++ b/src/lib/components/forms/updatePFP.svelte @@ -4,9 +4,13 @@ let files: FileList; - function submit() { + async function submit(e: SubmitEvent) { + e.preventDefault(); if (files.length === 0) return; - generateStream(files[0]); + const success = await generateStream(files[0]); + if (success) { + // success feedback + } } diff --git a/src/lib/functions/generateReadableStream.ts b/src/lib/functions/generateReadableStream.ts index 6833587..a375c69 100644 --- a/src/lib/functions/generateReadableStream.ts +++ b/src/lib/functions/generateReadableStream.ts @@ -1,8 +1,11 @@ export async function generateStream(file: File): Promise { try { + const formData = new FormData(); + formData.append('file', file); + await fetch(`/api/upload/`, { method: 'POST', - body: file, + body: formData, }); return true; diff --git a/src/lib/server/storage/minio-client.ts b/src/lib/server/storage/minio-client.ts index d80c2a7..b41dfcf 100644 --- a/src/lib/server/storage/minio-client.ts +++ b/src/lib/server/storage/minio-client.ts @@ -31,10 +31,16 @@ class MinioClient { console.log('Bucket "' + bucket + '" created in "us-east-1".'); } - const upload = await this.client.putObject(bucket, v4(), stream); - console.log(upload); + const objectId = v4(); + const upload = await this.client.putObject(bucket, objectId, stream); + return { + bucket, + objectId, + etag: upload.etag, + }; } catch (e) { console.error(`Error uploading file: ${(e as Error).message}`); + throw e; } } } diff --git a/src/routes/(server)/api/upload/+server.ts b/src/routes/(server)/api/upload/+server.ts index c2f6e6c..d9e6245 100644 --- a/src/routes/(server)/api/upload/+server.ts +++ b/src/routes/(server)/api/upload/+server.ts @@ -1,5 +1,7 @@ -import { error } from '@sveltejs/kit'; +import { error, json } from '@sveltejs/kit'; import { auth } from '$lib/server/db/auth'; +import { fsClient } from '$lib/server/storage/minio-client'; +import { Readable } from 'stream'; export const POST = async ({ request }) => { const session = await auth.api.getSession({ @@ -10,5 +12,22 @@ export const POST = async ({ request }) => { return error(401, 'Not authorized. Please sign up at /sign-up'); } - return new Response(undefined, { status: 204 }); + try { + const formData = await request.formData(); + const file = formData.get('file'); + + if (!file || !(file instanceof File)) { + return error(400, 'No file provided'); + } + + const buffer = await file.arrayBuffer(); + const stream = Readable.from(Buffer.from(buffer)); + + const uploadResponse = await fsClient?.uploadProfile(stream); + + return json(uploadResponse); + } catch (e) { + console.error(e); + return error(500, 'Error uploading file'); + } };