From 8142c72c93ee46c9c4b0cb7973b8b42e40e11f67 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Mon, 17 Feb 2025 18:14:50 +0100 Subject: [PATCH] Api/Compress: Add image compression server endpoint --- src/routes/api/compress/+server.ts | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/routes/api/compress/+server.ts diff --git a/src/routes/api/compress/+server.ts b/src/routes/api/compress/+server.ts new file mode 100644 index 0000000..e037fd6 --- /dev/null +++ b/src/routes/api/compress/+server.ts @@ -0,0 +1,45 @@ +import { image_to_avif } from "$lib/server/image"; +import { error } from "@sveltejs/kit"; +import type { RequestHandler } from "./$types"; + +/** + * This route is available at /api/compress. + * It will return the image as a compressed [avif] [Blob]. + * We need this because [sharp] is a server-side node library. + */ +export const POST: RequestHandler = async ({ request }) => { + console.log("Hit /api/compress..."); + const data: FormData = await request.formData(); + + const image: File | undefined = data.has("image") ? (data.get("image") as File) : undefined; + const width: number | undefined = data.has("width") + ? parseInt(data.get("width")?.toString() ?? "-1") + : undefined; + const height: number | undefined = data.has("height") + ? parseInt(data.get("height")?.toString() ?? "-1") + : undefined; + const quality: number | undefined = data.has("quality") + ? parseInt(data.get("quality")?.toString() ?? "-1") + : undefined; + const effort: number | undefined = data.has("effort") + ? parseInt(data.get("effort")?.toString() ?? "-1") + : undefined; + + if (!image) { + error(500, "Can't compress image without image data"); + } + + const compressedImage: Blob = await image_to_avif( + await image.arrayBuffer(), + width, + height, + quality, + effort, + ); + + return new Response(compressedImage, { + headers: { + "Content-Type": "image/avif", + }, + }); +};