refactor file upload, mroe helpers and get image meta data

merge-requests/208/head
fatchan 5 years ago
parent 90a8093bd2
commit 8002569954
  1. 71
      controllers/api.js
  2. 2
      helpers/file-check-mime-types.js
  3. 17
      helpers/file-identify.js
  4. 19
      helpers/file-thumbnail.js
  5. 18
      helpers/file-upload.js
  6. 39
      helpers/file.js
  7. 6
      helpers/uploadDirectory.js

@ -5,7 +5,12 @@ const express = require('express')
, utils = require('../utils.js')
, Posts = require(__dirname+'/../models/posts.js')
, Boards = require(__dirname+'/../models/boards.js')
, files = require(__dirname+'/../helpers/file.js')
, uuidv4 = require('uuid/v4')
, path = require('path')
, fileUpload = require(__dirname+'/../helpers/file-upload.js')
, fileThumbnail = require(__dirname+'/../helpers/file-thumbnail.js')
, fileIdentify = require(__dirname+'/../helpers/file-identify.js')
, fileCheckMimeType = require(__dirname+'/../helpers/file-check-mime-types.js')
// make new post
router.post('/board/:board', Boards.exists, async (req, res, next) => {
@ -23,15 +28,46 @@ router.post('/board/:board', Boards.exists, async (req, res, next) => {
}
}
let filename = '';
//we got a file
if (req.files != null && Object.keys(req.files).length > 0) {
try {
// save and thumb it
filename = await files.uploadAndThumb(req, res);
} catch (err) {
console.error(err);
return res.status(500).json({ 'message': 'Error uploading file' });
let files = [];
// check for file
if (req.files != null) {
// get names and amounc
const fileKeys = Object.keys(req.files);
const numFiles = fileKeys.length
// if we got a file
if (numFiles > 0) {
// check all mime types befoer we try saving anything
for (let i = 0; i < numFiles; i++) {
if (!fileCheckMimeType(req.files[fileKeys[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 filename = uuidv4() + path.extname(file.name);
// try to save, thumbnail and get metadata
try {
await fileUpload(req, res, filename);
const fileData = await fileIdentify(filename);
await fileThumbnail(filename);
files.push({
filename: filename,
originalFilename: file.name,
mimetype: file.mimetype,
size: file.size,
dimensions: fileData.size,
geometry: fileData.Geometry,
size: fileData.Filesize
})
} catch (err) {
console.error(err);
//TODO: DELETE FAILED FILES
return res.status(500).json({ 'message': 'Error uploading file' });
}
}
}
}
@ -41,7 +77,7 @@ router.post('/board/:board', Boards.exists, async (req, res, next) => {
'date': new Date(),
'content': req.body.content,
'thread': req.body.thread || null,
'file': filename
'files': files
};
const post = await Posts.insertOne(req.params.board, data)
@ -129,6 +165,19 @@ router.get('/boards', Boards.exists, async (req, res, next) => {
});
/*
(async () => {
await Boards.deleteIncrement('b');
await Boards.deleteAll();
await Boards.insertOne({
_id: 'b',
name: 'random',
description: 'post anything here',
})
await Posts.deleteAll('b');
})();
*/
/*
(async () => {
await Boards.deleteIncrement('b');

@ -2,4 +2,4 @@
const allowedMimeTypes = new Set(['image/jpeg', 'image/pjpeg', 'image/png', 'image/gif']);
module.exports = (file) => allowedMimeTypes.has(file.mimetype);
module.exports = (mimetype) => allowedMimeTypes.has(mimetype);

@ -0,0 +1,17 @@
const gm = require('@tohru/gm')
, configs = require(__dirname+'/../configs/main.json')
, uploadDirectory = require(__dirname+'/uploadDirectory.js');
module.exports = (filename) => {
return new Promise((resolve, reject) => {
gm(uploadDirectory + filename)
.identify(function (err, data) {
if (err) {
return reject(err);
}
return resolve(data)
});
});
};

@ -0,0 +1,19 @@
const gm = require('@tohru/gm')
, configs = require(__dirname+'/../configs/main.json')
, uploadDirectory = require(__dirname+'/uploadDirectory.js');
module.exports = (filename) => {
return new Promise((resolve, reject) => {
gm(uploadDirectory + filename)
.resize(128, 128)
.noProfile()
.write(uploadDirectory + 'thumb-' + filename, function (err) {
if (err) {
return reject(err);
}
});
return resolve();
});
};

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

@ -1,39 +0,0 @@
'use strict';
const isValidFile = require(__dirname+'/filefilter.js')
, path = require('path')
, uploadDest = path.join(__dirname, '/../static/img/')
, uuidv4 = require('uuid/v4')
, gm = require('@tohru/gm');
module.exports = {
uploadDest,
uploadAndThumb: (req, res) => {
return new Promise((resolve, reject) => {
const file = req.files.file;
//check type
if (!isValidFile(file)) {
return reject(new Error('Unsupported file type'))
}
//save it
const filename = uuidv4() + path.extname(file.name);
file.mv(uploadDest + filename, function (err) {
if (err) {
return reject(err);
}
//thumbnail it
gm(uploadDest + filename)
.resize(128, 128)
.noProfile()
.write(uploadDest + 'thumb-' + filename, function (err) {
if (err) {
return reject(err);
}
return resolve(filename);
});
});
});
},
};

@ -0,0 +1,6 @@
'use strict';
const path = require('path');
const directory = path.join(__dirname+'/../static/img/')
module.exports = directory;
Loading…
Cancel
Save