mirror of
https://github.com/seanmorley15/AdventureLog.git
synced 2026-03-30 12:11:53 -04:00
76 lines
1.9 KiB
TypeScript
76 lines
1.9 KiB
TypeScript
// src/routes/api/upload.js
|
|
|
|
import { ensureBucketExists, uploadObject } from "$lib/server/s3";
|
|
import type { RequestEvent } from "@sveltejs/kit";
|
|
import { generateId } from "lucia";
|
|
|
|
export async function POST(event: RequestEvent): Promise<Response> {
|
|
try {
|
|
const contentType = event.request.headers.get("content-type") ?? "";
|
|
const fileExtension = contentType.split("/").pop();
|
|
const fileName = `${generateId(25)}.${fileExtension}`;
|
|
const bucket = event.request.headers.get("bucket") as string;
|
|
|
|
if (!fileExtension || !fileName) {
|
|
return new Response(JSON.stringify({ error: "Invalid file type" }), {
|
|
status: 400,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
}
|
|
|
|
if (!bucket) {
|
|
return new Response(
|
|
JSON.stringify({ error: "Bucket name is required" }),
|
|
{
|
|
status: 400,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
}
|
|
);
|
|
}
|
|
|
|
// check if the file is an image
|
|
if (!contentType.startsWith("image")) {
|
|
return new Response(JSON.stringify({ error: "Invalid file type" }), {
|
|
status: 400,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
}
|
|
|
|
const fileBuffer = await event.request.arrayBuffer();
|
|
const metaData = {
|
|
"Content-Type": contentType,
|
|
};
|
|
|
|
await ensureBucketExists(bucket);
|
|
|
|
const objectUrl = await uploadObject(
|
|
bucket,
|
|
fileName,
|
|
Buffer.from(fileBuffer)
|
|
);
|
|
|
|
console.log(`File uploaded to ${objectUrl}`);
|
|
|
|
return new Response(JSON.stringify({ objectUrl }), {
|
|
status: 200,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
} catch (error) {
|
|
console.error(error);
|
|
return new Response(JSON.stringify({ error: "Error occured" }), {
|
|
status: 500,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
}
|
|
}
|