From 5f916e97ea89336424e0f17c391fb27ea7073160 Mon Sep 17 00:00:00 2001 From: Jonatan Nilsson Date: Wed, 6 Jul 2022 14:50:54 +0000 Subject: [PATCH] Formidable: Better handling for file uploads. Now supports multiple keys --- flaska.mjs | 46 +++++++++++++++++++----------- package.json | 2 +- test/client.mjs | 69 ++++++++++++++++++++++++++++----------------- test/http.test.mjs | 28 ++++++++++++++++++ test/test.jpg | Bin 0 -> 32213 bytes 5 files changed, 101 insertions(+), 44 deletions(-) create mode 100644 test/test.jpg diff --git a/flaska.mjs b/flaska.mjs index 0044556..9b60aea 100644 --- a/flaska.mjs +++ b/flaska.mjs @@ -248,29 +248,41 @@ export function FormidableHandler(formidable, org = {}) { } ctx.req.body = fields - ctx.req.file = files?.file || null + ctx.req.files = files + ctx.req.file = null - if (!ctx.req.file) { + + if (!ctx.req.files) { return res() } - let filename - let target + let keys = Object.keys(files).filter(key => Boolean(ctx.req.files[key])) - try { - filename = opts.filename(ctx.req.file) || ctx.req.file.name - target = path.join(opts.uploadDir, filename) - } catch (err) { - return rej(err) - } - - rename(ctx.req.file.path, target) - .then(function() { - ctx.req.file.path = target - ctx.req.file.filename = filename - }) - .then(res, rej) + Promise.all( + keys.map(key => { + let filename + let target + + try { + filename = opts.filename(ctx.req.files[key]) || ctx.req.files[key].name + target = path.join(opts.uploadDir, filename) + } catch (err) { + return Promise.reject(err) + } + return rename(ctx.req.files[key].path, target) + .then(function() { + ctx.req.files[key].path = target + ctx.req.files[key].filename = filename + }) + }) + ) + .then(() => { + if (keys.length === 1 && keys[0] === 'file') { + ctx.req.file = ctx.req.files.file + } + res() + }, rej) }) }) } diff --git a/package.json b/package.json index 957c47e..85ec795 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaska", - "version": "1.2.5", + "version": "1.3.0", "description": "Flaska is a micro web-framework for node. It is designed to be fast, simple and lightweight, and is distributed as a single file module with no dependencies.", "main": "flaska.mjs", "scripts": { diff --git a/test/client.mjs b/test/client.mjs index 5663c69..029c0b1 100644 --- a/test/client.mjs +++ b/test/client.mjs @@ -126,34 +126,51 @@ const random = (length = 8) => { return str; } -Client.prototype.upload = function(url, file, method = 'POST', body = {}) { - return fs.readFile(file).then(data => { - const crlf = '\r\n' +Client.prototype.upload = function(url, files, method = 'POST', body = {}) { + const boundary = `---------${random(32)}` + const crlf = '\r\n' + let upload = files + + if (typeof(upload) === 'string') { + upload = { + file: files + } + } + let keys = Object.keys(upload) + let uploadBody = [] + + return Promise.all(keys.map(key => { + let file = upload[key] + return fs.readFile(file).then(data => { const filename = path.basename(file) - const boundary = `---------${random(32)}` - const multipartBody = Buffer.concat([ - Buffer.from( - `${crlf}--${boundary}${crlf}` + - `Content-Disposition: form-data; name="file"; filename="${filename}"` + crlf + crlf - ), - data, - Buffer.concat(Object.keys(body).map(function(key) { - return Buffer.from('' - + `${crlf}--${boundary}${crlf}` - + `Content-Disposition: form-data; name="${key}"` + crlf + crlf - + JSON.stringify(body[key]) - ) - })), - Buffer.from(`${crlf}--${boundary}--`), - ]) + uploadBody.push(Buffer.from( + `${crlf}--${boundary}${crlf}` + + `Content-Disposition: form-data; name="${key}"; filename="${filename}"` + crlf + crlf + )) + uploadBody.push(data) + }) + })) + .then(() => { + uploadBody.push( + Buffer.concat(Object.keys(body).map(function(key) { + return Buffer.from('' + + `${crlf}--${boundary}${crlf}` + + `Content-Disposition: form-data; name="${key}"` + crlf + crlf + + JSON.stringify(body[key]) + ) + })) + ) + uploadBody.push(Buffer.from(`${crlf}--${boundary}--`)) - return this.customRequest(method, url, multipartBody, { - timeout: 5000, - headers: { - 'Content-Type': 'multipart/form-data; boundary=' + boundary, - 'Content-Length': multipartBody.length, - }, - }) + let multipartBody = Buffer.concat(uploadBody) + + return this.customRequest(method, url, multipartBody, { + timeout: 5000, + headers: { + 'Content-Type': 'multipart/form-data; boundary=' + boundary, + 'Content-Length': multipartBody.length, + }, + }) }) } diff --git a/test/http.test.mjs b/test/http.test.mjs index 168e31c..1d63c7b 100644 --- a/test/http.test.mjs +++ b/test/http.test.mjs @@ -60,6 +60,13 @@ flaska.post('/file/upload', FormidableHandler(formidable, { uploaded.push(ctx.req.file) ctx.body = ctx.req.file }) +flaska.post('/file/upload/many', FormidableHandler(formidable, { + uploadDir: './test/upload', +}), function(ctx) { + uploaded.push(ctx.req.files.herp) + uploaded.push(ctx.req.files.derp) + ctx.body = ctx.req.files +}) flaska.get('/file/leak', function(ctx) { file = fsSync.createReadStream('./test/test.png') ctx.body = file @@ -308,6 +315,27 @@ t.describe('/file/upload', function() { }) }) +t.describe('/file/upload/many', function() { + t.test('server should upload file', async function() { + let res = await client.upload('/file/upload/many', { + herp: './test/test.jpg', + derp: './test/test.png', + }) + + let [statSourcePng, statSourceJpg, statTargetHerp, statTargetDerp] = await Promise.all([ + fs.stat('./test/test.png'), + fs.stat('./test/test.jpg'), + fs.stat(res.herp.path), + fs.stat(res.derp.path), + ]) + + assert.strictEqual(statSourceJpg.size, statTargetHerp.size) + assert.strictEqual(statSourceJpg.size, res.herp.size) + assert.strictEqual(statSourcePng.size, statTargetDerp.size) + assert.strictEqual(statSourcePng.size, res.derp.size) + }) +}) + t.describe('HEAD', function() { const agent = new http.Agent({ keepAlive: true, diff --git a/test/test.jpg b/test/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f68a74f981e42723d554bec25c3c482aa04a367e GIT binary patch literal 32213 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 ZE1i8#-Af++z^gp|PXpV3UN`@n`CsaJQYrud literal 0 HcmV?d00001