checkFileSize in provider upload

This commit is contained in:
Marc-Roig 2022-09-13 10:21:30 +02:00
parent 3b53153723
commit df28f7026e
5 changed files with 27 additions and 15 deletions

View File

@ -4,9 +4,7 @@ module.exports = {
default: { default: {
enabled: true, enabled: true,
provider: 'local', provider: 'local',
providerOptions: { sizeLimit: 1000000,
sizeLimit: 1000000,
},
actionOptions: {}, actionOptions: {},
}, },
validator() {}, validator() {},

View File

@ -1,7 +1,9 @@
'use strict'; 'use strict';
const { PayloadTooLargeError } = require('@strapi/utils/lib/errors');
const _ = require('lodash'); const _ = require('lodash');
const registerUploadMiddleware = require('./middlewares/upload'); const registerUploadMiddleware = require('./middlewares/upload');
const { kbytesToBytes } = require('./utils/file');
/** /**
* Register upload plugin * Register upload plugin
@ -60,6 +62,25 @@ const createProvider = (config) => {
); );
} }
if (providerOptions.sizeLimit) {
// TODO V5: remove sizeLimit from providerOptions
process.emitWarning(
`[deprecated] In future versions, "sizeLimit" argument will be ignored from upload.config.providerOptions. Move it to upload.config`
);
}
if (!providerInstance.checkFileSize) {
providerInstance.checkFileSize = (file) => {
const fileSize = kbytesToBytes(file.size);
if (providerOptions.sizeLimit && fileSize > providerOptions.sizeLimit) {
throw new PayloadTooLargeError();
} else if (config.sizeLimit && fileSize > config.sizeLimit) {
throw new PayloadTooLargeError();
}
};
}
const wrappedProvider = _.mapValues(providerInstance, (method, methodName) => { const wrappedProvider = _.mapValues(providerInstance, (method, methodName) => {
return async function (file, options = actionOptions[methodName]) { return async function (file, options = actionOptions[methodName]) {
return providerInstance[methodName](file, options); return providerInstance[methodName](file, options);

View File

@ -5,6 +5,8 @@ const { streamToBuffer } = require('../utils/file');
module.exports = ({ strapi }) => ({ module.exports = ({ strapi }) => ({
async upload(file) { async upload(file) {
await strapi.plugin('upload').provider.checkFileSize(file);
if (isFunction(strapi.plugin('upload').provider.uploadStream)) { if (isFunction(strapi.plugin('upload').provider.uploadStream)) {
file.stream = file.getStream(); file.stream = file.getStream();
await strapi.plugin('upload').provider.uploadStream(file); await strapi.plugin('upload').provider.uploadStream(file);

View File

@ -6,6 +6,7 @@
const { Writable } = require('stream'); const { Writable } = require('stream');
const bytesToKbytes = (bytes) => Math.round((bytes / 1000) * 100) / 100; const bytesToKbytes = (bytes) => Math.round((bytes / 1000) * 100) / 100;
const kbytesToBytes = (kbytes) => kbytes * 1000;
const streamToBuffer = (stream) => const streamToBuffer = (stream) =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
@ -46,6 +47,7 @@ function writableDiscardStream(options) {
module.exports = { module.exports = {
streamToBuffer, streamToBuffer,
bytesToKbytes, bytesToKbytes,
kbytesToBytes,
getStreamSize, getStreamSize,
writableDiscardStream, writableDiscardStream,
}; };

View File

@ -9,18 +9,11 @@ const { pipeline } = require('stream');
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const fse = require('fs-extra'); const fse = require('fs-extra');
const { PayloadTooLargeError } = require('@strapi/utils').errors;
const UPLOADS_FOLDER_NAME = 'uploads'; const UPLOADS_FOLDER_NAME = 'uploads';
module.exports = { module.exports = {
init({ sizeLimit = 1000000 } = {}) { init() {
const verifySize = (file) => {
if (file.size > sizeLimit) {
throw new PayloadTooLargeError();
}
};
// Ensure uploads folder exists // Ensure uploads folder exists
const uploadPath = path.resolve(strapi.dirs.static.public, UPLOADS_FOLDER_NAME); const uploadPath = path.resolve(strapi.dirs.static.public, UPLOADS_FOLDER_NAME);
if (!fse.pathExistsSync(uploadPath)) { if (!fse.pathExistsSync(uploadPath)) {
@ -31,8 +24,6 @@ module.exports = {
return { return {
uploadStream(file) { uploadStream(file) {
verifySize(file);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
pipeline( pipeline(
file.stream, file.stream,
@ -50,8 +41,6 @@ module.exports = {
}); });
}, },
upload(file) { upload(file) {
verifySize(file);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// write file in public/assets folder // write file in public/assets folder
fs.writeFile(path.join(uploadPath, `${file.hash}${file.ext}`), file.buffer, (err) => { fs.writeFile(path.join(uploadPath, `${file.hash}${file.ext}`), file.buffer, (err) => {