From 092748f0dc41f58d8716cc5f1e7e2631d5198d0c Mon Sep 17 00:00:00 2001 From: fatchan Date: Sun, 31 Mar 2019 07:24:52 +0000 Subject: [PATCH] multiple file upload support --- controllers/api.js | 25 ++++++++++++++++++++----- helpers/file-upload.js | 3 +-- server.js | 4 ++-- static/css/style.css | 5 +++++ views/includes/postform.pug | 2 +- views/mixins/post.pug | 13 +++++++------ 6 files changed, 36 insertions(+), 16 deletions(-) diff --git a/controllers/api.js b/controllers/api.js index 270b8493..b712732f 100644 --- a/controllers/api.js +++ b/controllers/api.js @@ -33,8 +33,15 @@ const express = require('express') router.post('/board/:board', Boards.exists, async (req, res, next) => { //needs a refactor into a body validator of some sort - const fileKeys = Object.keys(req.files); - const numFiles = fileKeys.length + let numFiles = 0; + if (req.files && req.files.file) { + if (Array.isArray(req.files.file)) { + numFiles = req.files.file.length; + } else { + numFiles = 1; + req.files.file = [req.files.file]; + } + } if (!req.body.message && numFiles === 0) { return res.status(400).json({ 'message': 'Must provide a message or file' }); } @@ -57,6 +64,7 @@ router.post('/board/:board', Boards.exists, async (req, res, next) => { try { thread = await Posts.getThread(req.params.board, req.body.thread); } catch (err) { + console.error(err); return res.status(500).json({ 'message': 'Error fetching from DB' }); } if (!thread) { @@ -68,18 +76,19 @@ router.post('/board/:board', Boards.exists, async (req, res, next) => { // if we got a file if (numFiles > 0) { // check all mime types befoer we try saving anything + console.log(req.files) for (let i = 0; i < numFiles; i++) { - if (!fileCheckMimeType(req.files[fileKeys[i]].mimetype)) { + if (!fileCheckMimeType(req.files.file[i].mimetype)) { return res.status(400).json({ 'message': 'Invalid file type' }); } } // then upload, thumb, get metadata, etc. for (let i = 0; i < numFiles; i++) { - const file = req.files[fileKeys[i]]; + const file = req.files.file[i]; const filename = uuidv4() + path.extname(file.name); // try to save, thumbnail and get metadata try { - await fileUpload(req, res, filename); + await fileUpload(req, res, file, filename); const fileData = await fileIdentify(filename); await fileThumbnail(filename); const processedFile = { @@ -148,6 +157,7 @@ router.post('/board/:board/delete', Boards.exists, async (req, res, next) => { try { posts = await Posts.getPosts(req.params.board, req.body.checked); } catch (err) { + console.error(err); return res.status(500).json({ 'message': 'Error fetching from DB' }); } @@ -175,6 +185,7 @@ router.post('/board/:board/delete', Boards.exists, async (req, res, next) => { const result = await Posts.deleteMany(req.params.board, allPosts.map(x => x._id)); deletedPosts = result.deletedCount; } catch (err) { + console.error(err); return res.status(500).json({ 'message': 'Error deleting posts from DB' }); } @@ -210,6 +221,7 @@ router.get('/board/:board/recent/:page(\\d+)?', Boards.exists, async (req, res, try { threads = await Posts.getRecent(req.params.board, req.params.page || 1); } catch (err) { + console.error(err); return res.status(500).json({ 'message': 'Error fetching from DB' }); } @@ -229,6 +241,7 @@ router.get('/board/:board/thread/:id(\\d+)', Boards.exists, async (req, res, nex try { thread = await Posts.getThread(req.params.board, req.params.id); } catch (err) { + console.error(err); return res.status(500).json({ 'message': 'Error fetching from DB' }); } @@ -248,6 +261,7 @@ router.get('/board/:board/catalog', Boards.exists, async (req, res, next) => { try { data = await Posts.getCatalog(req.params.board); } catch (err) { + console.error(err); return res.status(500).json({ 'message': 'Error fetching from DB' }); } @@ -267,6 +281,7 @@ router.get('/boards', Boards.exists, async (req, res, next) => { try { boards = await Boards.find(); } catch (err) { + console.error(err); return res.status(500).json({ 'message': 'Error fetching from DB' }) } diff --git a/helpers/file-upload.js b/helpers/file-upload.js index f4853c08..90575ea9 100644 --- a/helpers/file-upload.js +++ b/helpers/file-upload.js @@ -3,10 +3,9 @@ const configs = require(__dirname+'/../configs/main.json') , uploadDirectory = require(__dirname+'/uploadDirectory.js'); -module.exports = (req, res, filename) => { +module.exports = (req, res, file, filename) => { return new Promise((resolve, reject) => { - const file = req.files.file; file.mv(uploadDirectory + filename, function (err) { if (err) { return reject(err); diff --git a/server.js b/server.js index dbb24ec9..4d99ac34 100644 --- a/server.js +++ b/server.js @@ -29,8 +29,8 @@ const express = require('express') safeFileNames: true, preserveExtension: true, limits: { - fileSize: 1 * 1024 * 1024, - files: 1 + fileSize: 10 * 1024 * 1024, + files: 3 }, abortOnLimit: true, useTempFile: true, diff --git a/static/css/style.css b/static/css/style.css index 2388209b..4c6979bd 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -26,6 +26,11 @@ input, textarea { display: inline-block; } +.post-file { + vertical-align: top; + display: inline-block; +} + input textares { padding: 8px; } diff --git a/views/includes/postform.pug b/views/includes/postform.pug index 29eea414..3a2d23e5 100644 --- a/views/includes/postform.pug +++ b/views/includes/postform.pug @@ -13,6 +13,6 @@ form.form-post(action='/api/board/'+board._id, enctype='multipart/form-data', me textarea#messagey(name='message', rows='8', cols='50', placeholder='message' autocomplete='off') - input#file(type='file', name='file') + input#file(type='file', name='file' multiple) input(type='submit', value='submit') diff --git a/views/mixins/post.pug b/views/mixins/post.pug index 6bacfc6c..4cffd33a 100644 --- a/views/mixins/post.pug +++ b/views/mixins/post.pug @@ -14,13 +14,14 @@ mixin post(board, post) if post.files.length > 0 .post-files each file in post.files - .post-file-info - span: a(href='/img/thumb-'+file.filename download=file.originalFilename) #{file.originalFilename} - span ( Size: #{file.sizeString} - span Dimensions: #{file.geometryString} ) .post-file - a(href='/img/'+file.filename) - object(data='/img/thumb-'+file.filename type=file.mimetype) + .post-file-info + span: a(href='/img/thumb-'+file.filename download=file.originalFilename) #{file.originalFilename} + span ( Size: #{file.sizeString} + span Dimensions: #{file.geometryString} ) + .post-file + a(href='/img/'+file.filename) + object(data='/img/thumb-'+file.filename type=file.mimetype) .post-message p(style='white-space: pre-wrap;') #{post.message}