You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

30 line
1.1 KiB

  1. import { NextResponse } from 'next/server';
  2. import { writeFile, mkdir } from 'fs/promises';
  3. import path from 'path';
  4. export async function POST(request: Request) {
  5. try {
  6. const formData = await request.formData();
  7. const file = formData.get('file') as File;
  8. if (!file) {
  9. return NextResponse.json({ error: 'No file received.' }, { status: 400 });
  10. }
  11. const buffer = Buffer.from(await file.arrayBuffer());
  12. // Strip special characters to prevent URL breaking
  13. const safeName = file.name.replace(/[^a-zA-Z0-9.-]/g, '_');
  14. const filename = `${Date.now()}-${safeName}`;
  15. // Save to data/uploads instead of public/uploads
  16. const uploadDir = path.join(process.cwd(), 'data', 'uploads');
  17. await mkdir(uploadDir, { recursive: true });
  18. await writeFile(path.join(uploadDir, filename), buffer);
  19. // Return a dynamic API route URL instead of a static path
  20. return NextResponse.json({ url: `/api/files?name=${filename}` }, { status: 201 });
  21. } catch (error) {
  22. console.error('Upload Error:', error);
  23. return NextResponse.json({ error: 'Failed to upload image.' }, { status: 500 });
  24. }
  25. }