Skip to content

Commit 26092d4

Browse files
authored
Allow single file upload (#150)
* add single file upload support for express * add generic method for request files extraction * use method for request files extraction in koa and fastify * add single file upload Express test * add single file upload Koa test * run linter
1 parent 193945b commit 26092d4

9 files changed

Lines changed: 67 additions & 3 deletions

File tree

src/frameworks/express.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const getRequestFiles = require('../utils/requestFilesExtractor');
2+
13
function getValidator(validateRequest) {
24
return function validate(req, res, next) {
35
const requestOptions = _getParameters(req);
@@ -13,9 +15,9 @@ function _getParameters(req) {
1315
requestOptions.headers = req.headers;
1416
requestOptions.params = req.params;
1517
requestOptions.query = req.query;
16-
requestOptions.files = req.files;
1718
requestOptions.method = req.method;
1819
requestOptions.body = req.body;
20+
requestOptions.files = getRequestFiles(req);
1921

2022
return requestOptions;
2123
}

src/frameworks/fastify.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
const fp = require('fastify-plugin');
2+
const getRequestFiles = require('../utils/requestFilesExtractor');
3+
24
let urijs;
35

46
function getValidator(validateRequest) {
@@ -42,7 +44,7 @@ function getValidator(validateRequest) {
4244
requestOptions.headers = req.headers;
4345
requestOptions.params = req.params;
4446
requestOptions.query = req.query;
45-
requestOptions.files = req.files;
47+
requestOptions.files = getRequestFiles(req);
4648
requestOptions.method = req.raw.method;
4749
requestOptions.body = req.body;
4850

src/frameworks/koa.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const getRequestFiles = require('../utils/requestFilesExtractor');
2+
13
function getValidator(validateRequest) {
24
return async function validate(ctx, next) {
35
const requestOptions = _getParameters(ctx);
@@ -15,7 +17,7 @@ function getValidator(validateRequest) {
1517
requestOptions.headers = ctx.request.req.headers;
1618
requestOptions.params = ctx.params;
1719
requestOptions.query = ctx.query;
18-
requestOptions.files = ctx.req.files;
20+
requestOptions.files = getRequestFiles(ctx.req);
1921
requestOptions.method = ctx.req.method;
2022
requestOptions.body = ctx.req.body || ctx.request.body;
2123

src/utils/requestFilesExtractor.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module.exports = (req) => {
2+
if (req.file || req.files) {
3+
const files = req.files ? req.files : [];
4+
if (req.file) {
5+
files.push(req.file);
6+
}
7+
return files;
8+
}
9+
};

test/express/middleware-test.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2332,6 +2332,19 @@ describe('input-validation middleware tests - Express', function () {
23322332
done();
23332333
});
23342334
});
2335+
it('supports single file upload', function (done) {
2336+
request(app)
2337+
.post('/singleFile')
2338+
.set('api-version', '1.0')
2339+
.attach('image', 'LICENSE')
2340+
.expect(200, function (err, res) {
2341+
if (err) {
2342+
throw err;
2343+
}
2344+
expect(res.body.result).to.equal('OK');
2345+
done();
2346+
});
2347+
});
23352348
});
23362349
describe('Keywords', function () {
23372350
let app;

test/express/test-server-formdata.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ module.exports = () => {
3737
app.post('/login', upload.any(), inputValidation.validate, function (req, res, next) {
3838
res.json({ result: 'OK' });
3939
});
40+
app.post('/singleFile', upload.single('image'), inputValidation.validate, function (req, res, next) {
41+
res.json({ result: 'OK' });
42+
});
4043
app.use(function (err, req, res, next) {
4144
if (err instanceof inputValidation.InputValidationError) {
4245
res.status(400).json({ more_info: err.errors });

test/form-data-swagger.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,22 @@ paths:
7575
responses:
7676
'200':
7777
description: Import result
78+
/singleFile:
79+
post:
80+
description: Single file upload
81+
produces:
82+
- application/json
83+
consumes:
84+
- multipart/form-data
85+
parameters:
86+
- name: image
87+
in: formData
88+
required: true
89+
type: file
90+
description: File to upload from.
91+
responses:
92+
'200':
93+
description: Import result
7894
definitions:
7995

8096
parameters:

test/koa/middleware-test.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2345,6 +2345,19 @@ describe('input-validation middleware tests - Koa', function () {
23452345
done();
23462346
});
23472347
});
2348+
it('supports single file upload', function (done) {
2349+
request(app)
2350+
.post('/singleFile')
2351+
.set('api-version', '1.0')
2352+
.attach('image', 'LICENSE')
2353+
.expect(200, function (err, res) {
2354+
if (err) {
2355+
throw err;
2356+
}
2357+
expect(res.body.result).to.equal('OK');
2358+
done();
2359+
});
2360+
});
23482361
});
23492362
describe('Keywords', function () {
23502363
let app;

test/koa/test-server-formdata.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ module.exports = () => {
5050
ctx.status = 200;
5151
ctx.body = { result: 'OK' };
5252
});
53+
router.post('/singleFile', upload.single('image'), inputValidation.validate, function (ctx, next) {
54+
ctx.status = 200;
55+
ctx.body = { result: 'OK' };
56+
});
5357

5458
return app;
5559
};

0 commit comments

Comments
 (0)