0

I was trying to send a post request to my api with formdata. However trying to access the request file in the route handler causes the error below:

export async function POST(req: NextApiRequest, res: NextApiResponse) {
    const data = req.files.file
    // const data = req.body
    console.log(data)
}

The function call api:

    const handleOnSubmit = () => {
        console.log('file', file)
        if (isLoading) return
        setIsLoading(true)
        const formData = new FormData();
        formData.append('file', file)
        axios.post('/api/text', formData)
            .then((res) => {
                console.log(res.data)
            })
            .catch((err) => {
                console.log(err)

            });
    }
john
  • 19
  • 3

2 Answers2

0

You can do it with a simple config export and formidable:

import formidable from "formidable";

export const config = {
  api: {
    bodyParser: false, // enable form data 
  },
};

const formidableParse = async (req) =>
  new Promise((resolve, reject) =>
    new formidable.IncomingForm().parse(req, (err, fields, files) =>
      err ? reject(err) : resolve([fields, files])
    )
  );

export async function POST(req, res) {
  const [fields, files] = await formidableParse(req);
  console.log(files)
}

Edit

Sometimes, you will have to update formidable to latest v3 version.

You also must not forget to add the Content-Type header:

axios.post('/api/text', formData, {
  headers: {
    "Content-Type": "multipart/form-data",
  },
});
devpolo
  • 2,487
  • 3
  • 12
  • 28
0

Correct import

import { IncomingForm, File } from 'formidable';<code>

Bad import

import formidable from 'formidable';

parse function

const parseFiles = async(req: NextApiRequest): Promise<string> => {

return new Promise( (resolve, reject) => {

    const form = new IncomingForm() ;
    form.parse( req, async( err, fields, files ) => {
        console.log({file: files.file});

        if ( err ) {
            return reject(err);
        }
//The files.file argument is an array
// Example use
        const filePath = await saveFile( files.file[0] as File )
        resolve(filePath);
    })

}) }

Versions formidable: 3.2.5 next: 13.4.6