48 lines
No EOL
1.3 KiB
TypeScript
48 lines
No EOL
1.3 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import path from "path";
|
|
import fs from "fs";
|
|
import crypto from "crypto";
|
|
|
|
|
|
const userDataDir = process.env.APP_DATA_DIRECTORY!;
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const formData = await request.formData();
|
|
const file = formData.get("file") as File;
|
|
|
|
if (!file) {
|
|
return NextResponse.json(
|
|
{ error: "No file provided" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
const bytes = await file.arrayBuffer();
|
|
const buffer = Buffer.from(bytes);
|
|
|
|
// Create uploads directory if it doesn't exist
|
|
const uploadsDir = path.join(userDataDir, "uploads");
|
|
fs.mkdirSync(uploadsDir, { recursive: true });
|
|
|
|
|
|
// Generate unique filename
|
|
const filename = `${crypto.randomBytes(16).toString("hex")}.png`;
|
|
const filePath = path.join(uploadsDir, filename);
|
|
|
|
// Write file to disk
|
|
fs.writeFileSync(filePath, buffer);
|
|
|
|
// Return the relative path that can be used in the frontend
|
|
return NextResponse.json({
|
|
success: true,
|
|
filePath: `${uploadsDir}/${filename}`
|
|
});
|
|
} catch (error) {
|
|
console.error("Error saving image:", error);
|
|
return NextResponse.json(
|
|
{ error: "Failed to save image" },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
} |