simple-images-upload/src/middleware/Uploads.js

187 lines
4.7 KiB
JavaScript
Raw Normal View History

2023-09-23 20:54:44 +02:00
import fs, {copyFileSync, mkdirSync, statSync} from 'fs';
import {join, extname} from 'path';
import multer from 'multer';
import sharp from 'sharp';
import {uid} from 'rand-token';
import Pages from './Pages';
import {getBaseUrl} from '../helpers';
import {pagination} from '../config';
const checkAndCreateDirectory = async (directory) => {
try {
return statSync(directory);
} catch (err) {
if (err.errno === -2) {
mkdirSync(directory);
} else {
throw err;
}
}
return true;
};
2023-09-25 00:31:06 +02:00
const checkAndCreateDirectories = async (req) => {
const {
user,
} = req;
const baseUrl = getBaseUrl(req);
const baseUploadDir = `${__dirname}/../../uploads/`;
const userUploadDir = join(baseUploadDir, user._id);
const userUri = `${baseUrl}/uploads/${user._id}`;
await checkAndCreateDirectory(baseUploadDir);
await checkAndCreateDirectory(userUploadDir);
return {
userUploadDir,
userUri,
};
};
2023-09-23 20:54:44 +02:00
const resizeImage = async (sourceImage, destImage, w, h) => {
return sharp(sourceImage)
.resize(w, h, {
fit: 'inside',
})
.toFile(destImage);
};
2023-09-25 00:31:06 +02:00
const upload = multer({
storage: multer.diskStorage({}),
fileFilter(multerReq, file, cb) {
const filetypes = /jpeg|jpg|png/;
const mimetype = filetypes.test(file.mimetype);
const filExtname = filetypes.test(
extname(file.originalname).toLowerCase(),
);
if (mimetype && filExtname) {
return cb(null, true);
}
const error = 'Seuls les fichiers de type jpg et png sont acceptés';
req.session.messages.push(error);
return cb(new Error(error));
},
}).single('image');
2023-09-23 20:54:44 +02:00
/**
* Classe permettant la gestion des images
*/
class Uploads extends Pages {
/**
2023-09-25 00:31:06 +02:00
* Méthode permettant d'ajouter un élément à la gallerie d'un utilisateur
2023-09-23 20:54:44 +02:00
* @param {*} req
*/
async postOne(req) {
await new Promise((resolve, reject) => {
2023-09-25 00:31:06 +02:00
upload(req, req.body, (err, data) => {
2023-09-23 20:54:44 +02:00
if (err) {
return reject(err);
}
resolve(data);
});
});
2023-09-25 00:31:06 +02:00
const {
userUploadDir,
userUri,
} = await checkAndCreateDirectories(req);
2023-09-23 20:54:44 +02:00
let ext = req.file.originalname.split('.');
ext = ext[ext.length - 1];
// eslint-disable-next-line max-len
const uploadname = `${uid(4)}_${Buffer.from(req.file.originalname).toString('base64')}.${ext}`;
const originalFileName = uploadname;
const mediumFileName = `medium_${uploadname}`;
const smallFileName = `small_${uploadname}`;
2023-09-26 08:58:38 +02:00
await Promise.all([
2023-09-25 00:31:06 +02:00
copyFileSync(req.file.path, join(userUploadDir, originalFileName)),
resizeImage(
req.file.path,
join(
userUploadDir,
mediumFileName,
),
800,
600,
),
resizeImage(
req.file.path,
join(
userUploadDir,
smallFileName,
),
300,
200,
),
]);
2023-09-23 20:54:44 +02:00
this.pageContent.page.upload = {
2023-09-25 00:31:06 +02:00
originalFile: `${userUri}/${originalFileName}`,
mediumFile: `${userUri}/${mediumFileName}`,
smallFile: `${userUri}/${smallFileName}`,
2023-09-23 20:54:44 +02:00
};
return true;
}
/**
* Méthode permettant d'afficher la liste des images d'un utilisateur
* @param {Object} req
*/
async getAll(req) {
const currentPage = Number(req.query.page || 1);
const startAt = (currentPage - 1) * pagination;
const endAt = startAt + pagination;
const listOfFiles = [];
let total = 0;
2023-09-25 00:31:06 +02:00
const {
userUploadDir,
userUri,
} = await checkAndCreateDirectories(req);
2023-09-23 20:54:44 +02:00
2023-09-25 00:31:06 +02:00
const files = fs.readdirSync(userUploadDir)
2023-09-23 20:54:44 +02:00
.map((v) => {
// eslint-disable-next-line max-len
2023-09-25 00:31:06 +02:00
return {name: v, time: statSync(join(userUploadDir, v)).mtime.getTime()};
2023-09-23 20:54:44 +02:00
})
.sort(function(a, b) {
return b.time - a.time;
})
.map(function(v) {
return v.name;
});
for (let i = 0; i < files.length; i += 1) {
const file = files[i];
if (file.indexOf('medium_') === 0) {
total += 1;
if (listOfFiles.length < endAt) {
2023-09-25 00:31:06 +02:00
console.log('file:', statSync(join(userUploadDir, file)));
2023-09-23 20:54:44 +02:00
listOfFiles.push({
2023-09-25 00:31:06 +02:00
originalFile: `${userUri}/${file.replace('medium_', '')}`,
mediumFile: `${userUri}/${file}`,
smallFile: `${userUri}/${file.replace('medium_', 'small_')}`,
time: statSync(join(userUploadDir, file)).mtime.getTime(),
2023-09-23 20:54:44 +02:00
});
}
}
}
this.pageContent.page.images = listOfFiles.slice(startAt);
this.pageContent.page.currentPage = currentPage;
// eslint-disable-next-line max-len
this.pageContent.page.totalPages = Math.floor(total / pagination) + (total % pagination > 0 ? 1 : 0);
}
}
module.exports = Uploads;