Skip to content

Commit bdf90fc

Browse files
authored
Merge pull request #1583 from jackey8616/fix/1580_mixed_form_data_with_file
Fix/mixed form-data w/ file cause 'length' problem
2 parents d0e0ea9 + 0e6a522 commit bdf90fc

File tree

6 files changed

+69
-6
lines changed

6 files changed

+69
-6
lines changed

packages/runtime/src/routeGeneration/templates/express/expressTemplateService.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,14 @@ export class ExpressTemplateService extends TemplateService<ExpressApiHandlerPar
8383
return this.validationService.ValidateParam(param, request.body[name], name, fieldErrors, 'body.', this.minimalSwaggerConfig);
8484
case 'formData': {
8585
const files = Object.values(args).filter(param => param.dataType === 'file');
86-
if (files.length > 0) {
86+
if (param.dataType === 'file' && files.length > 0) {
8787
const requestFiles = request.files as { [fileName: string]: Express.Multer.File[] };
8888
const fileArgs = this.validationService.ValidateParam(param, requestFiles[name], name, fieldErrors, undefined, this.minimalSwaggerConfig);
8989
return fileArgs.length === 1 ? fileArgs[0] : fileArgs;
9090
} else if (param.dataType === 'array' && param.array && param.array.dataType === 'file') {
9191
return this.validationService.ValidateParam(param, request.files, name, fieldErrors, undefined, this.minimalSwaggerConfig);
92-
} else {
93-
return this.validationService.ValidateParam(param, request.body[name], name, fieldErrors, undefined, this.minimalSwaggerConfig);
9492
}
93+
return this.validationService.ValidateParam(param, request.body[name], name, fieldErrors, undefined, this.minimalSwaggerConfig);
9594
}
9695
case 'res':
9796
return (status: number | undefined, data: any, headers: any) => {

packages/runtime/src/routeGeneration/templates/koa/koaTemplateService.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,13 @@ export class KoaTemplateService extends TemplateService<KoaApiHandlerParameters,
9393
case 'formData': {
9494
const files = Object.values(args).filter(param => param.dataType === 'file');
9595
const contextRequest = context.request as any;
96-
if (files.length > 0) {
96+
if (param.dataType === 'file' && files.length > 0) {
9797
const fileArgs = this.validationService.ValidateParam(param, contextRequest.files[name], name, errorFields, undefined, this.minimalSwaggerConfig);
9898
return fileArgs.length === 1 ? fileArgs[0] : fileArgs;
9999
} else if (param.dataType === 'array' && param.array && param.array.dataType === 'file') {
100100
return this.validationService.ValidateParam(param, contextRequest.files, name, errorFields, undefined, this.minimalSwaggerConfig);
101-
} else {
102-
return this.validationService.ValidateParam(param, contextRequest.body[name], name, errorFields, undefined, this.minimalSwaggerConfig);
103101
}
102+
return this.validationService.ValidateParam(param, contextRequest.body[name], name, errorFields, undefined, this.minimalSwaggerConfig);
104103
}
105104
case 'res':
106105
return async (status: number | undefined, data: any, headers: any): Promise<void> => {

tests/fixtures/controllers/postController.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,14 @@ export class PostTestController {
7575
return [fileA, fileB];
7676
}
7777

78+
@Post('MixedFormDataWithFile')
79+
public async mixedFormDataWithFile(
80+
@FormField('username') username: string,
81+
@UploadedFile('avatar') avatar: File,
82+
): Promise<{ username: string; avatar: File; }> {
83+
return { username, avatar };
84+
}
85+
7886
/**
7987
*
8088
* @param aFile File description of multipart

tests/integration/express-server.spec.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,6 +1560,25 @@ describe('Express Server', () => {
15601560
});
15611561
});
15621562

1563+
it('can post mixed form data content with file', () => {
1564+
const formData = {
1565+
username: 'test',
1566+
avatar: '@../tsconfig.json',
1567+
};
1568+
return verifyFileUploadRequest(`${basePath}/PostTest/MixedFormDataWithFile`, formData, (_err, res) => {
1569+
const file = res.body.avatar;
1570+
const packageJsonBuffer = readFileSync(resolve(__dirname, `../${file.originalname}`));
1571+
const returnedBuffer = Buffer.from(file.buffer);
1572+
expect(res.body.username).to.equal(formData.username);
1573+
expect(file).to.not.be.undefined;
1574+
expect(file.fieldname).to.be.not.undefined;
1575+
expect(file.originalname).to.be.not.undefined;
1576+
expect(file.encoding).to.be.not.undefined;
1577+
expect(file.mimetype).to.equal('application/json');
1578+
expect(Buffer.compare(returnedBuffer, packageJsonBuffer)).to.equal(0);
1579+
});
1580+
});
1581+
15631582
function verifyFileUploadRequest(
15641583
path: string,
15651584
formData: any,

tests/integration/hapi-server.spec.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,6 +1443,25 @@ describe('Hapi Server', () => {
14431443
});
14441444
});
14451445

1446+
it('can post mixed form data content with file', () => {
1447+
const formData = {
1448+
username: 'test',
1449+
avatar: '@../tsconfig.json',
1450+
};
1451+
return verifyFileUploadRequest(`${basePath}/PostTest/MixedFormDataWithFile`, formData, (_err, res) => {
1452+
const file = res.body.avatar;
1453+
const packageJsonBuffer = readFileSync(resolve(__dirname, `../${file.originalname}`));
1454+
const returnedBuffer = Buffer.from(file.buffer);
1455+
expect(res.body.username).to.equal(formData.username);
1456+
expect(file).to.not.be.undefined;
1457+
expect(file.fieldname).to.be.not.undefined;
1458+
expect(file.originalname).to.be.not.undefined;
1459+
expect(file.encoding).to.be.not.undefined;
1460+
expect(file.mimetype).to.equal('application/json');
1461+
expect(Buffer.compare(returnedBuffer, packageJsonBuffer)).to.equal(0);
1462+
});
1463+
});
1464+
14461465
function verifyFileUploadRequest(
14471466
path: string,
14481467
formData: any,

tests/integration/koa-server.spec.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,6 +1423,25 @@ describe('Koa Server', () => {
14231423
});
14241424
});
14251425

1426+
it('can post mixed form data content with file', () => {
1427+
const formData = {
1428+
username: 'test',
1429+
avatar: '@../tsconfig.json',
1430+
};
1431+
return verifyFileUploadRequest(`${basePath}/PostTest/MixedFormDataWithFile`, formData, (_err, res) => {
1432+
const file = res.body.avatar;
1433+
const packageJsonBuffer = readFileSync(resolve(__dirname, `../${file.originalname}`));
1434+
const returnedBuffer = Buffer.from(file.buffer);
1435+
expect(res.body.username).to.equal(formData.username);
1436+
expect(file).to.not.be.undefined;
1437+
expect(file.fieldname).to.be.not.undefined;
1438+
expect(file.originalname).to.be.not.undefined;
1439+
expect(file.encoding).to.be.not.undefined;
1440+
expect(file.mimetype).to.equal('application/json');
1441+
expect(Buffer.compare(returnedBuffer, packageJsonBuffer)).to.equal(0);
1442+
});
1443+
});
1444+
14261445
function verifyFileUploadRequest(
14271446
path: string,
14281447
formData: any,

0 commit comments

Comments
 (0)