101 lines
2.7 KiB
TypeScript
101 lines
2.7 KiB
TypeScript
import { createWriteStream } from 'fs';
|
|
import { join, dirname } from 'path';
|
|
import Busboy from 'busboy';
|
|
import mkdirp from 'mkdirp';
|
|
|
|
function formData(
|
|
contType: string,
|
|
options: busboy.BusboyConfig & {
|
|
abortOnLimit?: boolean;
|
|
tmpDir?: string;
|
|
onFile?: (
|
|
fieldname: string,
|
|
file: NodeJS.ReadableStream,
|
|
filename: string,
|
|
encoding: string,
|
|
mimetype: string
|
|
) => string;
|
|
onField?: (fieldname: string, value: any) => void; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
filename?: (oldName: string) => string;
|
|
} = {}
|
|
) {
|
|
console.log('Enter form data');
|
|
options.headers = {
|
|
'content-type': contType
|
|
};
|
|
|
|
return new Promise((resolve, reject) => {
|
|
const busb = new Busboy(options);
|
|
const ret = {};
|
|
|
|
this.bodyStream().pipe(busb);
|
|
|
|
busb.on('limit', () => {
|
|
if (options.abortOnLimit) {
|
|
reject(Error('limit'));
|
|
}
|
|
});
|
|
|
|
busb.on('file', function(fieldname, file, filename, encoding, mimetype) {
|
|
const value: { filePath: string|undefined, filename: string, encoding:string, mimetype: string } = {
|
|
filename,
|
|
encoding,
|
|
mimetype,
|
|
filePath: undefined
|
|
};
|
|
|
|
if (typeof options.tmpDir === 'string') {
|
|
if (typeof options.filename === 'function') filename = options.filename(filename);
|
|
const fileToSave = join(options.tmpDir, filename);
|
|
mkdirp(dirname(fileToSave));
|
|
|
|
file.pipe(createWriteStream(fileToSave));
|
|
value.filePath = fileToSave;
|
|
}
|
|
if (typeof options.onFile === 'function') {
|
|
value.filePath =
|
|
options.onFile(fieldname, file, filename, encoding, mimetype) || value.filePath;
|
|
}
|
|
|
|
setRetValue(ret, fieldname, value);
|
|
});
|
|
|
|
busb.on('field', function(fieldname, value) {
|
|
if (typeof options.onField === 'function') options.onField(fieldname, value);
|
|
|
|
setRetValue(ret, fieldname, value);
|
|
});
|
|
|
|
busb.on('finish', function() {
|
|
resolve(ret);
|
|
});
|
|
|
|
busb.on('error', reject);
|
|
});
|
|
}
|
|
|
|
function setRetValue(
|
|
ret: { [x: string]: any }, // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
fieldname: string,
|
|
value: { filename: string; encoding: string; mimetype: string; filePath?: string } | any // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
) {
|
|
if (fieldname.endsWith('[]')) {
|
|
fieldname = fieldname.slice(0, fieldname.length - 2);
|
|
if (Array.isArray(ret[fieldname])) {
|
|
ret[fieldname].push(value);
|
|
} else {
|
|
ret[fieldname] = [value];
|
|
}
|
|
} else {
|
|
if (Array.isArray(ret[fieldname])) {
|
|
ret[fieldname].push(value);
|
|
} else if (ret[fieldname]) {
|
|
ret[fieldname] = [ret[fieldname], value];
|
|
} else {
|
|
ret[fieldname] = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
export default formData;
|