This commit is contained in:
Flatlogic Bot 2026-04-05 16:14:46 +00:00
parent 14079e71ec
commit 83fcbfd315
3 changed files with 56 additions and 24 deletions

View File

@ -1,11 +1,20 @@
const util = require('util');
const Multer = require('multer');
const maxSize = 10 * 1024 * 1024;
let processFile = Multer({
storage: Multer.memoryStorage(),
limits: { fileSize: maxSize },
}).single("file");
const DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024;
let processFileMiddleware = util.promisify(processFile);
module.exports = processFileMiddleware;
const createProcessFile = (maxFileSize = DEFAULT_MAX_FILE_SIZE) => {
const processFile = Multer({
storage: Multer.memoryStorage(),
limits: { fileSize: maxFileSize },
}).single('file');
return util.promisify(processFile);
};
const defaultProcessFile = createProcessFile();
defaultProcessFile.createProcessFile = createProcessFile;
defaultProcessFile.DEFAULT_MAX_FILE_SIZE = DEFAULT_MAX_FILE_SIZE;
module.exports = defaultProcessFile;

View File

@ -1,29 +1,38 @@
const express = require('express');
const config = require('../config');
const path = require('path');
const passport = require('passport');
const services = require('../services/file');
const router = express.Router();
router.get('/download', (req, res) => {
if (process.env.NODE_ENV == "production" || process.env.NEXT_PUBLIC_BACK_API) {
services.downloadGCloud(req, res);
const DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024;
const MEDIA_UPLOAD_MAX_FILE_SIZE = 512 * 1024 * 1024;
const getMaxFileSize = (table, field) => {
if (table === 'media_assets' && field === 'file') {
return MEDIA_UPLOAD_MAX_FILE_SIZE;
}
else {
return DEFAULT_MAX_FILE_SIZE;
};
router.get('/download', (req, res) => {
if (process.env.NODE_ENV == 'production' || process.env.NEXT_PUBLIC_BACK_API) {
services.downloadGCloud(req, res);
} else {
services.downloadLocal(req, res);
}
});
router.post('/upload/:table/:field', passport.authenticate('jwt', {session: false}), (req, res) => {
const fileName = `${req.params.table}/${req.params.field}`;
router.post('/upload/:table/:field', passport.authenticate('jwt', { session: false }), (req, res) => {
const { table, field } = req.params;
const fileName = `${table}/${field}`;
const maxFileSize = getMaxFileSize(table, field);
if (process.env.NODE_ENV == "production" || process.env.NEXT_PUBLIC_BACK_API) {
services.uploadGCloud(fileName, req, res);
}
else {
if (process.env.NODE_ENV == 'production' || process.env.NEXT_PUBLIC_BACK_API) {
services.uploadGCloud(fileName, req, res, { maxFileSize });
} else {
services.uploadLocal(fileName, {
entity: null,
maxFileSize: 10 * 1024 * 1024,
maxFileSize,
folderIncludesAuthenticationUid: false,
})(req, res);
}

View File

@ -78,6 +78,11 @@ const uploadLocal = (
});
form.on('error', function (err) {
if (err && /maxFileSize|maxFieldsSize|maxTotalFileSize/i.test(err.message || '')) {
res.status(413).send({ message: 'File is too large for this upload.' });
return;
}
res.status(500).send(err);
});
}
@ -91,8 +96,11 @@ const downloadLocal = async (req, res) => {
res.download(path.join(config.uploadDir, privateUrl));
}
const initGCloud = () => {
const processFile = require("../middlewares/upload");
const initGCloud = (maxFileSize) => {
const defaultProcessFile = require('../middlewares/upload');
const processFile = maxFileSize
? defaultProcessFile.createProcessFile(maxFileSize)
: defaultProcessFile;
const { Storage } = require("@google-cloud/storage");
const crypto = require('crypto')
@ -112,9 +120,10 @@ const initGCloud = () => {
return {hash, bucket, processFile};
}
const uploadGCloud = async (folder, req, res) => {
const uploadGCloud = async (folder, req, res, options = {}) => {
try {
const {hash, bucket, processFile} = initGCloud();
const { maxFileSize } = options;
const {hash, bucket, processFile} = initGCloud(maxFileSize);
await processFile(req, res);
let buffer = await req.file.buffer;
let filename = await req.body.filename;
@ -155,6 +164,11 @@ const uploadGCloud = async (folder, req, res) => {
} catch (err) {
console.log(err);
if (err && err.code === 'LIMIT_FILE_SIZE') {
res.status(413).send({ message: 'File is too large for this upload.' });
return;
}
res.status(500).send({
message: `Could not upload the file. ${err}`
});