Port image routes
This commit is contained in:
37
src/routes/api/image/+server.ts
Normal file
37
src/routes/api/image/+server.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { UPLOAD_DIR } from '$env/static/private'
|
||||
import { promises as fs } from "fs"
|
||||
import { join } from 'path'
|
||||
import { randomBytes } from 'crypto';
|
||||
import { httpResponse } from '$lib/server/http';
|
||||
|
||||
export async function POST({ request }) {
|
||||
try {
|
||||
const formData = await request.formData();
|
||||
const file = formData.get('image');
|
||||
|
||||
return await writeImage(file as File)
|
||||
|
||||
} catch (error) {
|
||||
return httpResponse({ error: `Failed to upload image, ${error}` }, 500);
|
||||
}
|
||||
}
|
||||
|
||||
async function writeImage(file: File) {
|
||||
if (!file || !(file instanceof File)) {
|
||||
return httpResponse({ error: 'No image provided' }, 400);
|
||||
}
|
||||
|
||||
if (!file.type.match(/^image\/(jpeg|jpg|png)$/)) {
|
||||
return httpResponse({ error: 'Only JPG and PNG allowed' }, 400);
|
||||
}
|
||||
|
||||
const ext = file.name.split('.').pop();
|
||||
const filename = `${randomBytes(16).toString('hex')}.${ext}`;
|
||||
const filepath = join(UPLOAD_DIR, filename);
|
||||
|
||||
// Save file
|
||||
const buffer = Buffer.from(await file.arrayBuffer());
|
||||
await fs.writeFile(filepath, buffer);
|
||||
|
||||
return httpResponse({ url: `/api/image/${filename}`}, 201);
|
||||
}
|
||||
35
src/routes/api/image/[id]/+server.ts
Normal file
35
src/routes/api/image/[id]/+server.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { UPLOAD_DIR } from '$env/static/private'
|
||||
import { promises as fs } from "fs"
|
||||
import { join } from 'path'
|
||||
import { httpResponse } from '$lib/server/http';
|
||||
|
||||
export async function GET({ params }) {
|
||||
try {
|
||||
const { id } = params
|
||||
return readImage(id!)
|
||||
} catch (error) {
|
||||
return httpResponse({ error: `Failed to retrieve image: ${error}` }, 500);
|
||||
}
|
||||
}
|
||||
|
||||
async function readImage(id: string) {
|
||||
|
||||
const filepath = join(UPLOAD_DIR, id);
|
||||
|
||||
try {
|
||||
await fs.access(filepath);
|
||||
} catch {
|
||||
return httpResponse({ error: 'Image not found' }, 404);
|
||||
}
|
||||
|
||||
const image = await fs.readFile(filepath);
|
||||
const ext = id.split('.').pop()?.toLowerCase();
|
||||
const contentType = ext === 'png' ? 'image/png' : 'image/jpeg';
|
||||
|
||||
return new Response(image, {
|
||||
status: 200,
|
||||
headers: {
|
||||
'Content-Type': contentType,
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user