| | import formidable from 'formidable'; |
| | import type { IncomingMessage } from 'http'; |
| |
|
| | const normalizeFormData = <T>(values: Record<string, T | T[]>) => { |
| | for (const key in values) { |
| | const value = values[key]; |
| | if (Array.isArray(value) && value.length === 1) { |
| | values[key] = value[0]; |
| | } |
| | } |
| | }; |
| |
|
| | |
| | |
| | |
| | export const createMultiFormDataParser = (maxFormDataSizeInMb: number) => { |
| | return async function parseMultipartFormData(req: IncomingMessage): Promise<{ |
| | data: formidable.Fields; |
| | files: formidable.Files; |
| | }> { |
| | const { encoding } = req; |
| |
|
| | const form = formidable({ |
| | multiples: true, |
| | encoding: encoding as formidable.BufferEncoding, |
| | maxFileSize: maxFormDataSizeInMb * 1024 * 1024, |
| | |
| | }); |
| |
|
| | return await new Promise((resolve) => { |
| | form.parse(req, async (_err, data, files) => { |
| | normalizeFormData(data); |
| | normalizeFormData(files); |
| | resolve({ data, files }); |
| | }); |
| | }); |
| | }; |
| | }; |
| |
|