diff --git a/packages/strapi-plugin-upload/config/config.json b/packages/strapi-plugin-upload/config/config.json new file mode 100644 index 0000000000..b41440d212 --- /dev/null +++ b/packages/strapi-plugin-upload/config/config.json @@ -0,0 +1,8 @@ +{ + "enabled": true, + "provider": "local", + "providerOptions": { + "sizeLimit": 1000 + }, + "providers": [] +} diff --git a/packages/strapi-plugin-upload/config/functions/bootstrap.js b/packages/strapi-plugin-upload/config/functions/bootstrap.js index 9a77be3354..96c5226442 100644 --- a/packages/strapi-plugin-upload/config/functions/bootstrap.js +++ b/packages/strapi-plugin-upload/config/functions/bootstrap.js @@ -17,13 +17,6 @@ module.exports = async () => { key: 'settings', }); - Object.assign(strapi.plugins.upload.config, { - enabled: true, - provider: 'local', - sizeLimit: 1000000, - providers: [], - }); - const installedProviders = Object.keys(strapi.config.info.dependencies) .filter(d => d.includes('strapi-provider-upload-')) .concat('strapi-provider-upload-local'); diff --git a/packages/strapi-plugin-upload/config/schema.graphql.js b/packages/strapi-plugin-upload/config/schema.graphql.js index 505a718bfe..915279b698 100644 --- a/packages/strapi-plugin-upload/config/schema.graphql.js +++ b/packages/strapi-plugin-upload/config/schema.graphql.js @@ -36,9 +36,7 @@ module.exports = { resolver: async (obj, { file: upload, ...fields }) => { const file = await formatFile(upload, fields); - const config = strapi.plugins.upload.config; - - const uploadedFiles = await strapi.plugins.upload.services.upload.upload([file], config); + const uploadedFiles = await strapi.plugins.upload.services.upload.upload([file]); // Return response. return uploadedFiles.length === 1 ? uploadedFiles[0] : uploadedFiles; @@ -50,9 +48,7 @@ module.exports = { resolver: async (obj, { files: uploads, ...fields }) => { const files = await Promise.all(uploads.map(upload => formatFile(upload, fields))); - const config = strapi.plugins.upload.config; - - const uploadedFiles = await strapi.plugins.upload.services.upload.upload(files, config); + const uploadedFiles = await strapi.plugins.upload.services.upload.upload(files); // Return response. return uploadedFiles; @@ -79,7 +75,7 @@ const formatFile = async (upload, fields) => { ext: path.extname(filename), buffer, mime: mimetype, - size: (buffer.length / 1000).toFixed(2), + size: Math.round((stream.size / 1000) * 100) / 100, }; const { refId, ref, source, field } = fields; diff --git a/packages/strapi-plugin-upload/controllers/Upload.js b/packages/strapi-plugin-upload/controllers/Upload.js index 16e6eb8013..3095ca34ec 100644 --- a/packages/strapi-plugin-upload/controllers/Upload.js +++ b/packages/strapi-plugin-upload/controllers/Upload.js @@ -13,24 +13,15 @@ module.exports = { const uploadService = strapi.plugins.upload.services.upload; // Retrieve provider configuration. - const config = strapi.plugins.upload.config; + const { enabled } = strapi.plugins.upload.config; // Verify if the file upload is enable. - if (config.enabled === false) { - return ctx.badRequest( - null, - - [ - { - messages: [ - { - id: 'Upload.status.disabled', - message: 'File upload is disabled', - }, - ], - }, - ] - ); + if (enabled === false) { + throw strapi.errors.badRequest(null, { + errors: [ + { id: 'Upload.status.disabled', message: 'File upload is disabled' }, + ], + }); } // Extract optional relational data. @@ -38,31 +29,15 @@ module.exports = { const { files = {} } = ctx.request.files || {}; if (_.isEmpty(files)) { - return ctx.badRequest(null, [ - { - messages: [{ id: 'Upload.status.empty', message: 'Files are empty' }], - }, - ]); + throw strapi.errors.badRequest(null, { + errors: [{ id: 'Upload.status.empty', message: 'Files are empty' }], + }); } // Transform stream files to buffer const buffers = await uploadService.bufferize(files); const enhancedFiles = buffers.map(file => { - if (file.size > config.sizeLimit) { - return ctx.badRequest(null, [ - { - messages: [ - { - id: 'Upload.status.sizeLimit', - message: `${file.name} file is bigger than limit size!`, - values: { file: file.name }, - }, - ], - }, - ]); - } - // Add details to the file to be able to create the relationships. if (refId && ref && field) { Object.assign(file, { @@ -92,7 +67,7 @@ module.exports = { return; } - const uploadedFiles = await uploadService.upload(enhancedFiles, config); + const uploadedFiles = await uploadService.upload(enhancedFiles); // Send 200 `ok` ctx.send(uploadedFiles); @@ -151,7 +126,6 @@ module.exports = { async destroy(ctx) { const { id } = ctx.params; - const config = strapi.plugins.upload.config; const file = await strapi.plugins['upload'].services.upload.fetch({ id }); @@ -159,7 +133,7 @@ module.exports = { return ctx.notFound('file.notFound'); } - await strapi.plugins['upload'].services.upload.remove(file, config); + await strapi.plugins['upload'].services.upload.remove(file); ctx.send(file); }, diff --git a/packages/strapi-plugin-upload/services/Upload.js b/packages/strapi-plugin-upload/services/Upload.js index 2928b9576c..6db615f588 100644 --- a/packages/strapi-plugin-upload/services/Upload.js +++ b/packages/strapi-plugin-upload/services/Upload.js @@ -45,7 +45,7 @@ module.exports = { ext: stream.name.split('.').length > 1 ? `.${_.last(stream.name.split('.'))}` : '', buffer, mime: stream.type, - size: (stream.size / 1000).toFixed(2), + size: Math.round((stream.size / 1000) * 100) / 100, }; }; @@ -53,7 +53,9 @@ module.exports = { return Promise.all(files.map(stream => createBuffer(stream))); }, - async upload(files, config) { + async upload(files) { + const config = strapi.plugins.upload.config; + // Get upload provider settings to configure the provider to use. const provider = _.find(strapi.plugins.upload.config.providers, { provider: config.provider, @@ -65,23 +67,17 @@ module.exports = { ); } - const actions = await provider.init(config); + const actions = await provider.init(config.providerOptions); // upload a single file const uploadFile = async file => { await actions.upload(file); - // Remove buffer to don't save it. delete file.buffer; file.provider = provider.provider; const res = await this.add(file); - // Remove temp file - if (file.tmpPath) { - fs.unlinkSync(file.tmpPath); - } - strapi.eventHub.emit('media.create', { media: res }); return res; }; @@ -108,18 +104,18 @@ module.exports = { return strapi.query('file', 'upload').count(params); }, - async remove(file, config) { + async remove(file) { + const config = strapi.plugins.upload.config; + // get upload provider settings to configure the provider to use - const provider = _.cloneDeep( - _.find(strapi.plugins.upload.config.providers, { - provider: config.provider, - }) - ); - _.assign(provider, config); - const actions = provider.init(config); + const provider = _.find(strapi.plugins.upload.config.providers, { + provider: config.provider, + }); + + const actions = provider.init(config.providerOptions); // execute delete function of the provider - if (file.provider === provider.provider) { + if (file.provider === config.provider) { await actions.delete(file); } @@ -133,9 +129,6 @@ module.exports = { }, async uploadToEntity(params, files, source) { - // Retrieve provider settings from database. - const config = strapi.plugins.upload.config; - const model = strapi.getModel(params.model, source); // Asynchronous upload. @@ -161,7 +154,7 @@ module.exports = { }); // Make upload async. - return this.upload(enhancedFiles, config); + return this.upload(enhancedFiles); }) ); }, diff --git a/packages/strapi-provider-upload-local/lib/index.js b/packages/strapi-provider-upload-local/lib/index.js index a682a15af3..c5ee76a4d9 100644 --- a/packages/strapi-provider-upload-local/lib/index.js +++ b/packages/strapi-provider-upload-local/lib/index.js @@ -7,44 +7,70 @@ // Public node modules. const fs = require('fs'); const path = require('path'); -/* eslint-disable no-unused-vars */ + module.exports = { provider: 'local', name: 'Local server', - init: (config) => { + init: ({ sizeLimit = 1000000 } = {}) => { + const verifySize = file => { + if (file.size > sizeLimit) { + throw strapi.errors.badRequest('FileToBig', { + errors: [ + { + id: 'Upload.status.sizeLimit', + message: `${file.name} file is bigger than limit size!`, + values: { file: file.name }, + }, + ], + }); + } + }; + return { - upload: (file) => { + upload: file => { + verifySize(file); + return new Promise((resolve, reject) => { // write file in public/assets folder - fs.writeFile(path.join(strapi.config.public.path, `/uploads/${file.hash}${file.ext}`), file.buffer, (err) => { + fs.writeFile( + path.join( + strapi.config.public.path, + `/uploads/${file.hash}${file.ext}` + ), + file.buffer, + err => { + if (err) { + return reject(err); + } + + file.url = `/uploads/${file.hash}${file.ext}`; + + resolve(); + } + ); + }); + }, + delete: file => { + return new Promise((resolve, reject) => { + const filePath = path.join( + strapi.config.public.path, + `/uploads/${file.hash}${file.ext}` + ); + + if (!fs.existsSync(filePath)) { + return resolve("File doesn't exist"); + } + + // remove file from public/assets folder + fs.unlink(filePath, err => { if (err) { return reject(err); } - file.url = `/uploads/${file.hash}${file.ext}`; - resolve(); }); }); }, - delete: (file) => { - return new Promise((resolve, reject) => { - const filePath = path.join(strapi.config.public.path, `/uploads/${file.hash}${file.ext}`); - - if (!fs.existsSync(filePath)) { - return resolve('File doesn\'t exist'); - } - - // remove file from public/assets folder - fs.unlink(filePath, (err) => { - if (err) { - return reject(err); - } - - resolve(); - }); - }); - } }; - } + }, };