File size: 1,091 Bytes
aec3094 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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];
}
}
};
/**
* Creates a function that parses the multipart form data into the request's `body` property
*/
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,
// TODO: pass a custom `fileWriteStreamHandler` to create binary data files directly
});
return await new Promise((resolve) => {
form.parse(req, async (_err, data, files) => {
normalizeFormData(data);
normalizeFormData(files);
resolve({ data, files });
});
});
};
};
|