ai-flash-card / src / app / api / upload / route.tsx
route.tsx
Raw
import { promises as fs } from 'fs';
import { v4 as uuidv4 } from 'uuid';
import PDFParser from 'pdf2json';
import { NextRequest, NextResponse } from 'next/server';
import path from 'path';

export async function POST(req: NextRequest) {
  const formData: FormData = await req.formData();
  const uploadedFiles = formData.getAll('file');
  let fileName = '';
  let parsedText = '';

  if (uploadedFiles && uploadedFiles.length > 0) {
    const uploadedFile = uploadedFiles[0];

    // Check if uploadedFile is of type File
    if (uploadedFile instanceof File) {
      // Generate a unique filename
      fileName = `${uuidv4()}.pdf`;

      // Convert the uploaded file into a temporary file
      const filePath = path.join(process.cwd(), 'data', fileName);

      try {
        // Convert ArrayBuffer to Buffer
        const fileBuffer = Buffer.from(await uploadedFile.arrayBuffer());

        // Save the buffer as a file
        await fs.writeFile(filePath, fileBuffer);

        // Initialize PDF parser
        const pdfParser = new (PDFParser as any)(null, 1);

        // Define event handlers
        pdfParser.on('pdfParser_dataError', (errData: any) =>
          console.error('PDF parsing error:', errData.parserError)
        );

        // Use a promise to handle the parsing completion
        await new Promise<void>((resolve, reject) => {
          pdfParser.on('pdfParser_dataReady', () => {
            parsedText = pdfParser.getRawTextContent();
            resolve();
          });
          pdfParser.on('pdfParser_dataError', reject);
          pdfParser.loadPDF(filePath);
        });

      } catch (error) {
        console.error('Error processing file:', error);
        return new NextResponse(
          JSON.stringify({ success: false, error: 'Error processing file' }),
          { status: 500 }
        );
      }
    } else {
      return new NextResponse(
        JSON.stringify({ success: false, error: 'Uploaded file is not in the expected format' }),
        { status: 400 }
      );
    }
  } else {
    return new NextResponse(
      JSON.stringify({ success: false, error: 'No files found' }),
      { status: 400 }
    );
  }

  const response = new NextResponse(
    JSON.stringify({ success: true, parsedText })
  );
  response.headers.set('Content-Type', 'application/json');
  response.headers.set('FileName', fileName);
  return response;
}