This package allows you to use elFinder file manager with Nodejs. It currently implements LocalFileStorage only. Work is being done to allow ftp, ssh and cloud storage compatibility.
https://studio-42.github.io/elFinder/
npm install elfinder-node --saveor
yarn add elfinder-nodeThis package should be implemented as a middleware for Express server. You can see an example of how this package is used here.
Below is a summary of how it is used:
const express = require('express');
const app = express();
const { elfinder, LocalFileStorage } = require('elfinder-node');
const roots = [
{
driver: LocalFileStorage,
URL: 'https://google.com/uploads/', //Required
path: '/path/to/dir', //Required
permissions: { read: 1, write: 1, lock: 0 },
},
{
driver: LocalFileStorage,
URL: '/404/', //Required
path: 'private', //Required
permissions: { read: 1, write: 0, lock: 1 },
},
];
app.use('/connector', elfinder(roots));
app.listen(process.env.PORT || 8000);You can also define roots dynamically per request — useful for serving a different root directory per user:
app.use('/connector', (req, res, next) =>
elfinder([
{
driver: LocalFileStorage,
URL: `/uploads/${req.user.id}/`,
path: `/storage/${req.user.id}`,
permissions: { read: 1, write: 1, lock: 0 },
},
])(req, res, next)
);Note: This package is built as CommonJS and works with both require() and ES Module import statements.
The connector takes an array of volumes. All volumes must be configured with a driver before the connector is initiated.
driver[Required] - The volume driver to use. UseLocalFileStoragefor local filesystem access, or implement a custom driver for other storage backends (S3, FTP, SSH, etc.)URL[Required] - The URL which will be used to resolve filespath[Required] - The location of the folder or storage identifierpermissions[optional] - An object containing the file permissions. The permissions will apply to everyone if you use an object as shown in the example above. You can also use a custom function which returns an object containing the permissions. This is useful for a multi-user system.
permissions: function (path) {
if (user.canAccess(path)) {
return { read: 1, write: 1, lock: 0 };
} else return { read: 0, write: 0, lock: 1 };
};elfinder(roots, options) accepts an optional second argument:
busboy[optional, defaulttrue] - The connector parses multipart uploads with its ownexpress-busboyinstance. Set this tofalseif your host app already runs a multipart parser ahead of this router (e.g. a globalexpress-busboy/busboymiddleware mounted onapp). The raw request stream can only be read once, so running a second parser here would hang waiting on an already-drained stream — withbusboy: false, the connector trustsreq.body/req.filesto already be populated by your own parser instead.
const express = require('express');
const busboy = require('express-busboy');
const { elfinder, LocalFileStorage } = require('elfinder-node');
const app = express();
// Host app's own global multipart parser, mounted ahead of the connector
busboy.extend(app, { upload: true });
const roots = [
{
driver: LocalFileStorage,
URL: '/uploads/',
path: '/path/to/dir',
permissions: { read: 1, write: 1, lock: 0 },
},
];
// busboy: false — reuse req.body/req.files already populated above instead
// of parsing the request a second time
app.use('/connector', elfinder(roots, { busboy: false }));
app.listen(process.env.PORT || 8000);Most of the work was done by @quantv
When setting up your volumes, ensure you provide correct paths for your operating system:
const roots = [
{
driver: LocalFileStorage,
path: 'C:\\Users\\username\\uploads' // Windows
URL: '/uploads/',
permissions: { read: 1, write: 1, lock: 0 }
}
];Thanks to @quantv and the community for their contributions!