From 9a0fca4a22839eeb83cc945ed9102e22bd1610d4 Mon Sep 17 00:00:00 2001 From: Jonatan Nilsson Date: Sat, 13 Aug 2022 01:03:06 +0000 Subject: [PATCH] noprefix now auto-adds prefix if file exists. --- api/media/formidable.mjs | 47 ++++++++++++++++++++++++---------------- package.json | 2 +- test/media/api.test.mjs | 39 +++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 20 deletions(-) diff --git a/api/media/formidable.mjs b/api/media/formidable.mjs index 2a427f0..e9dba0a 100644 --- a/api/media/formidable.mjs +++ b/api/media/formidable.mjs @@ -6,30 +6,35 @@ import config from '../config.mjs' let lastDateString = '' let incrementor = 1 +function getPrefix() { + const date = new Date() + let prefix = '' + + // Generate 'YYYYMMDD_HHMMSS_' prefix + prefix = date + .toISOString() + .replace(/-/g, '') + .replace('T', '_') + .replace(/:/g, '') + .replace(/\..+/, '_') + + // Append xx_ if same date is hit multiple times + if (prefix === lastDateString) { + prefix += incrementor.toString().padStart('2', '0') + '_' + incrementor++ + } else { + lastDateString = prefix + incrementor = 1 + } + + return prefix +} + export function uploadFile(ctx, siteName, noprefix = false) { return new Promise((res, rej) => { - const date = new Date() let prefix = '' - if (!noprefix) { - // Generate 'YYYYMMDD_HHMMSS_' prefix - prefix = date - .toISOString() - .replace(/-/g, '') - .replace('T', '_') - .replace(/:/g, '') - .replace(/\..+/, '_') - - // Append xx_ if same date is hit multiple times - if (prefix === lastDateString) { - prefix += incrementor.toString().padStart('2', '0') + '_' - incrementor++ - } else { - lastDateString = prefix - } - } - var form = new formidable.IncomingForm() form.uploadDir = `./public/${siteName}` form.maxFileSize = config.get('fileSize') @@ -46,6 +51,10 @@ export function uploadFile(ctx, siteName, noprefix = false) { }) ctx.req.body = fields + if (!noprefix || fs.existsSync(`./public/${siteName}/${prefix}${file.name}`)) { + prefix = getPrefix() + } + fs.rename(files.file.path, `./public/${siteName}/${prefix}${file.name}`, function(err) { if (err) return rej(err) file.path = `./public/${siteName}/${prefix}${file.name}` diff --git a/package.json b/package.json index 41536dd..68c18cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "storage-upload", - "version": "2.1.3", + "version": "2.1.4", "description": "", "main": "index.js", "scripts": { diff --git a/test/media/api.test.mjs b/test/media/api.test.mjs index 14a0cbd..ab2ed0d 100644 --- a/test/media/api.test.mjs +++ b/test/media/api.test.mjs @@ -183,6 +183,45 @@ t.describe('Media (API)', () => { assert.strictEqual(img.height, 700) assert.strictEqual(img.format, 'png') }) + + t.test('should upload and create file with prefix if exists', async () => { + let token = encode(null, { iss: 'development' }, secret) + + await fs.unlink(resolve(`../../public/development/test.png`)).catch(function() {}) + + let datas = [] + datas.push(await client.upload( + `/media/noprefix?token=${token}`, + resolve('test.png') + )) + + datas.push(await client.upload( + `/media/noprefix?token=${token}`, + resolve('test.png') + )) + + testFiles.push(datas[0].path) + testFiles.push(datas[1].path) + + let prefix = new Date().toISOString().replace(/-/g,'').split('T')[0] + + let first = datas[0] + let second = datas[1] + + assert.notStrictEqual(first.filename, second.filename) + assert.notOk(first.filename.startsWith(currYear)) + assert.notOk(first.filename.startsWith(prefix)) + assert.ok(second.filename.startsWith(currYear)) + assert.ok(second.filename.startsWith(prefix)) + + let stats = await Promise.all([ + fs.stat(resolve('test.png')), + fs.stat(resolve('../../public/development/test.png')), + fs.stat(resolve('../../public/development/' + second.filename)), + ]) + assert.strictEqual(stats[0].size, stats[1].size) + assert.strictEqual(stats[0].size, stats[2].size) + }) }) t.timeout(10000).describe('POST /media/resize', function temp() {