multiple file upload support

merge-requests/208/head
fatchan 5 years ago
parent 223aca3e38
commit 092748f0dc
  1. 25
      controllers/api.js
  2. 3
      helpers/file-upload.js
  3. 4
      server.js
  4. 5
      static/css/style.css
  5. 2
      views/includes/postform.pug
  6. 13
      views/mixins/post.pug

@ -33,8 +33,15 @@ const express = require('express')
router.post('/board/:board', Boards.exists, async (req, res, next) => { router.post('/board/:board', Boards.exists, async (req, res, next) => {
//needs a refactor into a body validator of some sort //needs a refactor into a body validator of some sort
const fileKeys = Object.keys(req.files); let numFiles = 0;
const numFiles = fileKeys.length 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) { if (!req.body.message && numFiles === 0) {
return res.status(400).json({ 'message': 'Must provide a message or file' }); 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 { try {
thread = await Posts.getThread(req.params.board, req.body.thread); thread = await Posts.getThread(req.params.board, req.body.thread);
} catch (err) { } catch (err) {
console.error(err);
return res.status(500).json({ 'message': 'Error fetching from DB' }); return res.status(500).json({ 'message': 'Error fetching from DB' });
} }
if (!thread) { if (!thread) {
@ -68,18 +76,19 @@ router.post('/board/:board', Boards.exists, async (req, res, next) => {
// if we got a file // if we got a file
if (numFiles > 0) { if (numFiles > 0) {
// check all mime types befoer we try saving anything // check all mime types befoer we try saving anything
console.log(req.files)
for (let i = 0; i < numFiles; i++) { 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' }); return res.status(400).json({ 'message': 'Invalid file type' });
} }
} }
// then upload, thumb, get metadata, etc. // then upload, thumb, get metadata, etc.
for (let i = 0; i < numFiles; i++) { 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); const filename = uuidv4() + path.extname(file.name);
// try to save, thumbnail and get metadata // try to save, thumbnail and get metadata
try { try {
await fileUpload(req, res, filename); await fileUpload(req, res, file, filename);
const fileData = await fileIdentify(filename); const fileData = await fileIdentify(filename);
await fileThumbnail(filename); await fileThumbnail(filename);
const processedFile = { const processedFile = {
@ -148,6 +157,7 @@ router.post('/board/:board/delete', Boards.exists, async (req, res, next) => {
try { try {
posts = await Posts.getPosts(req.params.board, req.body.checked); posts = await Posts.getPosts(req.params.board, req.body.checked);
} catch (err) { } catch (err) {
console.error(err);
return res.status(500).json({ 'message': 'Error fetching from DB' }); 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)); const result = await Posts.deleteMany(req.params.board, allPosts.map(x => x._id));
deletedPosts = result.deletedCount; deletedPosts = result.deletedCount;
} catch (err) { } catch (err) {
console.error(err);
return res.status(500).json({ 'message': 'Error deleting posts from DB' }); 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 { try {
threads = await Posts.getRecent(req.params.board, req.params.page || 1); threads = await Posts.getRecent(req.params.board, req.params.page || 1);
} catch (err) { } catch (err) {
console.error(err);
return res.status(500).json({ 'message': 'Error fetching from DB' }); 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 { try {
thread = await Posts.getThread(req.params.board, req.params.id); thread = await Posts.getThread(req.params.board, req.params.id);
} catch (err) { } catch (err) {
console.error(err);
return res.status(500).json({ 'message': 'Error fetching from DB' }); 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 { try {
data = await Posts.getCatalog(req.params.board); data = await Posts.getCatalog(req.params.board);
} catch (err) { } catch (err) {
console.error(err);
return res.status(500).json({ 'message': 'Error fetching from DB' }); return res.status(500).json({ 'message': 'Error fetching from DB' });
} }
@ -267,6 +281,7 @@ router.get('/boards', Boards.exists, async (req, res, next) => {
try { try {
boards = await Boards.find(); boards = await Boards.find();
} catch (err) { } catch (err) {
console.error(err);
return res.status(500).json({ 'message': 'Error fetching from DB' }) return res.status(500).json({ 'message': 'Error fetching from DB' })
} }

@ -3,10 +3,9 @@
const configs = require(__dirname+'/../configs/main.json') const configs = require(__dirname+'/../configs/main.json')
, uploadDirectory = require(__dirname+'/uploadDirectory.js'); , uploadDirectory = require(__dirname+'/uploadDirectory.js');
module.exports = (req, res, filename) => { module.exports = (req, res, file, filename) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const file = req.files.file;
file.mv(uploadDirectory + filename, function (err) { file.mv(uploadDirectory + filename, function (err) {
if (err) { if (err) {
return reject(err); return reject(err);

@ -29,8 +29,8 @@ const express = require('express')
safeFileNames: true, safeFileNames: true,
preserveExtension: true, preserveExtension: true,
limits: { limits: {
fileSize: 1 * 1024 * 1024, fileSize: 10 * 1024 * 1024,
files: 1 files: 3
}, },
abortOnLimit: true, abortOnLimit: true,
useTempFile: true, useTempFile: true,

@ -26,6 +26,11 @@ input, textarea {
display: inline-block; display: inline-block;
} }
.post-file {
vertical-align: top;
display: inline-block;
}
input textares { input textares {
padding: 8px; padding: 8px;
} }

@ -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') 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') input(type='submit', value='submit')

@ -14,13 +14,14 @@ mixin post(board, post)
if post.files.length > 0 if post.files.length > 0
.post-files .post-files
each file in 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 .post-file
a(href='/img/'+file.filename) .post-file-info
object(data='/img/thumb-'+file.filename type=file.mimetype) 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 .post-message
p(style='white-space: pre-wrap;') #{post.message} p(style='white-space: pre-wrap;') #{post.message}

Loading…
Cancel
Save