FileGator - a free, open-source, self-hosted web application for managing files and folders.

Last update: May 22, 2022

Live demo Build Status PHP master Build Status Node master Code Coverage License

FileGator - Powerful Multi-User File Manager

FileGator is a free, open-source, self-hosted web application for managing files and folders.

You can manage files inside your local repository folder (on your server's hard drive) or connect to other storage adapters (see below).

FileGator has multi-user support so you can have admins and other users managing files with different access permissions, roles and home folders.

All basic file operations are supported: copy, move, rename, edit, create, delete, preview, zip, unzip, download, upload.

If allowed, users can download multiple files or folders at once.

File upload supports drag&drop, progress bar, pause and resume. Upload is chunked so you should be able to upload large files regardless of your server configuration.

Screenshot

Sponsors & Backers

FileGator is a free, open-source project. It's an independent project with its ongoing development made possible entirely thanks to the support by these awesome backers. If you'd like to join them, please consider:

Typical use cases

  • share a folder with colleagues, your team, friends or family
  • give students access to upload their work
  • allow workers to upload field data / docs / images
  • use as cloud backup
  • manage cdn with multiple people
  • use as ftp/sftp replacement
  • manage s3 or other 3rd party cloud storage
  • use to quickly zip and download remote files

Demo

https://demo.filegator.io

This is read-only demo with guest account enabled.

  • you can log in as john/john to see John's private files
  • or jane/jane as readonly + download user.

Documentation

Check out the documentation

Features & Goals

  • Multiple storage adapters (Local, FTP, Amazon S3, Dropbox, DO Spaces, Azure Blob and many others via Flysystem)
  • Multiple auth adapters with roles and permissions (Store users in json file, database or use WordPress)
  • Multiple session adapters (Native File, Pdo, Redis, MongoDB, Memcached and others via Symfony)
  • Single page front-end (built with Vuejs, Bulma and Buefy)
  • Chunked uploads (built with Resumable.js)
  • Zip and bulk download support
  • Highly extensible, decoupled and tested code
  • No database required
  • Framework free

Limitations

  • Symlinks are not supported by the underlying Flysystem
  • File permission operations are not supported (chmod/chown)

Minimum Requirements

  • PHP 7.2.5+ (with php-zip extension)

See install instructions for Ubuntu 18.04 or Debian 10.3. Get $100 in (server credits here) so you can play around.

Download precompiled build

Precompiled build is created for non-developers. In this version, the frontend (html, css and javascript) is compiled for you and the source code is removed so the final archive contains only minimum files.

Download & install instructions

Project setup for development (Linux)

You must have git, php, npm, and composer installed.

git clone https://github.com/filegator/filegator.git
cd filegator
cp configuration_sample.php configuration.php
chmod -R 775 private/
chmod -R 775 repository/
composer install --ignore-platform-reqs
npm install
npm run build

Compiles and hot-reloads

The following command will launch backend and frontend on ports 8081 and 8080:

npm run serve

Once everything is ready visit: http://localhost:8080

Run tests & static analysis

Testing requires xdebug, php-zip and sqlite php extensions.

vendor/bin/phpunit
vendor/bin/phpstan analyse ./backend
npm run lint
npm run e2e

Deployment

Set the website document root to /dist directory. This is also known as 'public' folder.

NOTE: For security reasons /dist is the ONLY folder you want to be exposed through the web. Everything else should be outside of your web root, this way people can’t access any of your important files through the browser.

Show your support

Please ⭐️ this repository if this project helped you!

Security

If you discover any security related issues, please email [email protected] instead of using the issue tracker.

License

Copyright (c) 2019 Milos Stojanovic.

This project is MIT licensed.

GitHub

https://github.com/filegator/filegator
Comments
  • 1. Bug report

    Describe the bug Unable to connect AWS S3 Bucket

    Logs [2021-12-04 11:07:47] default.ALERT: Fatal Error (E_ERROR): Uncaught Error: Class 'Aws\S3\S3Client' not found in /var/www/filegator/configuration.php:110 Stack trace: #0 /var/www/filegator/backend/Services/Storage/Filesystem.php(32): {closure}() #1 /var/www/filegator/backend/App.php(33): Filegator\Services\Storage\Filesystem->init() #2 /var/www/filegator/dist/index.php(53): Filegator\App->__construct() #3 {main} thrown {"code":1,"message":"Uncaught Error: Class 'Aws\S3\S3Client' not found in /var/www/filegator/configuration.php:110\nStack trace:\n#0 /var/www/filegator/backend/Services/Storage/Filesystem.php(32): {closure}()\n#1 /var/www/filegator/backend/App.php(33): Filegator\Services\Storage\Filesystem->init()\n#2 /var/www/filegator/dist/index.php(53): Filegator\App->__construct()\n#3 {main}\n thrown","file":"/var/www/filegator/configuration.php","line":110,"trace":null} []

    Environment (please complete the following information):

    • FileGator Version - 7.7
    • Server:AWS Instance - Ubuntu 20.04 (S3 role applied to instance)
    • PHP Version 7.4.3

    Installed as per instructions

    Updated to composer 2 within /var/www/filegator sudo composer require league/flysystem-aws-s3-v3 -W (cant without sudo)

    commented out current filesystem in /var/www/filegator/configuration.php

    Added

            'Filegator\Services\Storage\Filesystem' => [
                'handler' => '\Filegator\Services\Storage\Filesystem',
                'config' => [
                    'separator' => '/',
                    'config' => [],
                    'adapter' => function () {
                        $client = new \Aws\S3\S3Client([
                            'region' => 'eu-west-1',
                            'version' => 'latest',
                        ]);
    
                        return new \League\Flysystem\AwsS3v3\AwsS3Adapter($client, 'storagebucket');
                    },
                ],
            ],
    

    As the ec2 has the s3 role says dont need credentials.

    Any ideas?

    Reviewed by Pilly170 at 2021-12-04 11:17
  • 2. Exception from Symphony on start if session already active

    Describe the bug I've added a link to filegator from our menu, but running into a problem having to do with the session. We already have a session active and used to track the user, so when Filegator tries to load I get the following error:

    Fatal error: Uncaught LogicException: Cannot change the name of an active session. in C:\XFER\filegator\vendor\symfony\http-foundation\Session\Storage\Proxy\AbstractProxy.php:117 Stack trace: #0 C:\XFER\filegator\vendor\symfony\http-foundation\Session\Storage\NativeSessionStorage.php(201): Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy->setName('filegator') #1 C:\XFER\filegator\vendor\symfony\http-foundation\Session\Session.php(223): Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage->setName('filegator') #2 C:\XFER\filegator\backend\Services\Session\Adapters\SessionStorage.php(35): Symfony\Component\HttpFoundation\Session\Session->setName('filegator') #3 C:\XFER\filegator\backend\App.php(33): Filegator\Services\Session\Adapters\SessionStorage->init(Array) #4 C:\XFER\filegator\dist\index.php(53): Filegator\App->__construct(Object(Filegator\Config\Config), Object(Filegator\Kernel\Request), Object(Filegator\Kernel\Response), Object(Filegator\Kernel\StreamedResponse), Object(Filegator in C:\XFER\filegator\vendor\symfony\http-foundation\Session\Storage\Proxy\AbstractProxy.php on line 117

    To Reproduce Happens on load

    Expected behavior A clear and concise description of what you expected to happen.

    Screenshots If applicable, add screenshots to help explain your problem.

    Logs Log contains only the error above

    Environment (please complete the following information):

    • Server: IIS
    • PHP Version 7.2.14

    Additional context

    Ideally, we'd turn off sessions in FileGator. We don't want it to remember anything like last folder or anything else. Not sure that's an option though.

    Reviewed by Gerdofal at 2020-08-10 23:21
  • 3. Translations file

    Hi! It would be a problem that I made a Hungarian language file but it doesn't load. It is not displayed in Hungarian. I did it based on the description but it doesn't work. The languages that are in it work with the change.

    Reviewed by zsolti19850610 at 2020-10-28 19:22
  • 4. How do i attach the s3 storage adapter?

    i looked at your documentation already , as well as the flysystems doc . i installed the ("composer require league/flysystem-aws-s3-v3"). But still am confused where to put the html code you gave in your doc , I tried putting it in the configuration.php file doesnt work.

    can anyone help me try install the s3 adapter

    Reviewed by larslight11 at 2019-10-23 07:19
  • 5. Bug report: Search function is causing problems

    Describe the bug

    When using the search function, many parallel running PHP processes are opened to search recursively. Depending on the amount of processes, that can cause a server to crash.

    To Reproduce

    1. Open Filegator
    2. Search for a file
    3. See error

    Expected behavior

    Only submit the folder to be searched in and then from there search recursively within the same PHP process.

    Environment

    • FileGator Version: 7.5.2
    • Server: Apache 2.4.41 on Debian Linux
    • PHP Version: PHP 7.4
    • Browser: Chrome, Firefox
    Reviewed by tobiasgruber1995 at 2021-06-30 11:32
  • 6. how to rename a file without opening the directory tree

    Hello, is there any way to rename a file without opening the tree with all the root directories?

    renameItem: function(e) {
    				return new Promise((function(a, n) {
    					d.a.post("renameitem", {
    						from: e.from,
    						to: e.to,
    						destination: e.destination
    					}).then((function(e) {
    						return a(e.data.data)
    					}))["catch"]((function(e) {
    						return n(e)
    					}))
    				}))
    			},
    
    Reviewed by kainpro at 2021-02-17 22:03
  • 7. Enabling Private Repos results in fatal error

    Enabling this setting in configuration.php: 'private_repos' => true,

    Results in this error: Fatal error: Uncaught Error: Call to a member function setHomedir() on array in /usr/local/apache2/htdocs/filegator/backend/Services/Auth/Adapters/LDAP.php:213 Stack trace: #0 /usr/local/apache2/htdocs/filegator/backend/Services/Auth/Adapters/LDAP.php(113): Filegator\Services\Auth\Adapters\LDAP->getUsers() #1 /usr/local/apache2/htdocs/filegator/backend/Services/Auth/Adapters/LDAP.php(124): Filegator\Services\Auth\Adapters\LDAP->find('guest') #2 /usr/local/apache2/htdocs/filegator/backend/Services/Router/Router.php(33): Filegator\Services\Auth\Adapters\LDAP->getGuest() #3 /usr/local/apache2/htdocs/filegator/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(143): Filegator\Services\Router\Router->__construct(Object(Filegator\Kernel\Request), Object(Filegator\Services\Auth\Adapters\LDAP), Object(Filegator\Container\Container)) #4 /usr/local/apache2/htdocs/filegator/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(71): DI\Definition\Resolver\ObjectCreator->createInstance(Object(DI\Definition\ObjectD in /usr/local/apache2/htdocs/filegator/backend/Services/Auth/Adapters/LDAP.php on line 213

    I'm using v7.6.0.

    Reviewed by Timbo1966 at 2021-09-29 22:14
  • 8. MP4 video is displayed "inline" even though the mp4 extension is not in the "inline downloads" conf

    Describe the bug

    When I click on an mp4 video, it is displayed "inline" as a text, which shows garbarge

    To Reproduce Steps to reproduce the behavior:

    1. Put mp4 in your data folder
    2. Click on it in the filegator UI
    3. see garbage in the preview interface

    Expected behavior

    Either a download is triggered or the browser embeds a video and plays it

    Screenshots

    image

    Logs

    None seem relevant

    My conf has 'download_inline' => ['pdf'], // download inline in the browser, array of extensions, use * for all

    Environment (please complete the following information):

    • FileGator Version 7.4.5
    • Server: php:apache docker image
    • PHP Version: php:apache docker image (last php 7 I expect?)
    • Browser Firefox

    Additional context

    Reviewed by Gui13 at 2020-10-31 13:10
  • 9. Attempting to us FileGator on OSX Monterey (12.1)

    So I have been attempting to put FileGator on OSX with Apache2 and PHP, as you can see from phpinfo.pdf attached both are working. However when launching filegator i get a few execptions. I am not smart enough to understand what is wrong or missing hoping you can point toward solution to make this work.

    Thanks

    PHP 8.1.2 - phpinfo().pdf app.log web.log

    Reviewed by d21000 at 2022-02-18 13:23
  • 10. Bug report: Missing `SameSite` attribute in cookie `filegator`

    Describe the bug

    The cookie containing the session ID (filegator) is missing the SameSite attribute. That might cause the cookie to be rejected on some browsers.

    To Reproduce

    1. Open Filegator
    2. Open developer tools
    3. Open console
    4. See error

    Expected behavior

    The SameSite attribute should be set.

    Logs

    JavaScript error message:

    Cookie “filegator" will soon be rejected because it has the “SameSite” attribute set to “None” or an invalid value, without the “secure” attribute. To know more about the “SameSite” attribute, read https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie/SameSite.

    Environment

    • FileGator Version: 7.5.2
    • Server: Apache 2.4.41 on Debian Linux
    • PHP Version: PHP 7.4
    • Browser: Chrome, Firefox

    Additional context

    There are different options for the attribute: Lax, None and Strict. The default option is Lax, and I recommend keeping that. I tried setting it to Strict, but that causes an automatic logout on page reload.

    Reviewed by tobiasgruber1995 at 2021-06-30 11:13
  • 11. Repository Name or User Name visibility before Profile Filed

    Hello Dev Team!

    I really appreciate your hard work! is it possible to add the Repository name or user name visibility before the Profile Filed after successful login the user?

    Reviewed by b4allb4u at 2020-01-29 03:44
  • 12. Password encryption

    Describe the bug Sftp password is not encoded in configuration file

    To Reproduce See documentation file for SftpAdaptator

    Expected behavior SFTP password encryption in this file.

    Reviewed by fbetil at 2022-05-17 09:48
  • 13. Problem with uploading large music files

    My server limits it to 100/128MB but when i upload a music file higher than 30MB, it will make multiple with weird sizes and not upload it sometimes and then get stuck on 100%. How can i solve this?

    Reviewed by Minionguyjpro at 2022-04-27 11:55
  • 14. Need help with 3rd party Authentication

    I have been trying for days to filegator to work with Advanced Security php registration/login found in Code Canon.

    here is my attempt filegator/backend/Services/Auth/Adapters/AuthInterface.php

    * * For the full copyright and license information, please view the LICENSE file */ namespace Filegator\Services\Auth; interface AuthInterface { public function user(): ?User; // Id of currently authenticated user from //Advanced Security php registration/login application $userId = ASSession::get('user_id'); $user=$userId; //see if I can see user from Advanced Security php registration/login application echo $user; public function authenticate($username, $password): bool; // include '/var/www/clients/client1/web1/web/members/auth/ASEngine/AS.php'; if (! app('login')->isLoggedIn()) { return false; } {return true; } public function forget(); //same as json and database example { return $this->session->invalidate(); } public function find($username): ?User; { return null; // not used } public function store(User $user); // same as json and db example { return $this->session->set(self::SESSION_KEY, $user); } public function update($username, User $user, $password = ''): User; // don't need to update filegator user and password for testing // I will make sure there is an account in Advanced Security php registration/login application //that matches user in filegator //will do later when login works { return null; // not used } public function add(User $user, $password): User; // don't need to add to filegator user and password for testing // I will make sure there is an account in Advanced Security php registration/login application //that matches user in filegator //will do later when login works { return null; // not used } public function delete(User $user); // don't need to delete filegator user and password for testing // I will make sure there is an account in Advanced Security php registration/login application //that matches user in filegator //will do later when login works { return null; // not used } public function getGuest(): User; // same as wp example { $guest = new User(); $guest->setUsername('guest'); $guest->setName('Guest'); $guest->setRole('guest'); $guest->setHomedir('/'); $guest->setPermissions([]); return $guest; } public function allUsers(): UsersCollection; // not used in WP , data example { return null; // not used } } and I get these errors [2022-04-16 09:37:06] default.ALERT: Fatal Error (E_ERROR): Uncaught DI\NotFoundException: No entry or class found for '\Filegator\Services\Auth\AuthInterface.php' in /var/www/clients/client1/web1/web/members/filegator/vendor/php-di/php-di/src/Container.php:135 Stack trace: #0 /var/www/clients/client1/web1/web/members/filegator/backend/App.php(32): DI\Container->get() #1 /var/www/clients/client1/web1/web/members/filegator/dist/index.php(55): Filegator\App->__construct() #2 {main} thrown {"code":1,"message":"Uncaught DI\\NotFoundException: No entry or class found for '\\Filegator\\Services\\Auth\\AuthInterface.php' in /var/www/clients/client1/web1/web/members/filegator/vendor/php-di/php-di/src/Container.php:135\nStack trace:\n#0 /var/www/clients/client1/web1/web/members/filegator/backend/App.php(32): DI\\Container->get()\n#1 /var/www/clients/client1/web1/web/members/filegator/dist/index.php(55): Filegator\\App->__construct()\n#2 {main}\n thrown","file":"/var/www/clients/client1/web1/web/members/filegator/vendor/php-di/php-di/src/Container.php","line":135,"trace":null} [] [2022-04-16 09:37:31] default.ALERT: Fatal Error (E_PARSE): syntax error, unexpected '$userId' (T_VARIABLE), expecting function (T_FUNCTION) or const (T_CONST) {"code":4,"message":"syntax error, unexpected '$userId' (T_VARIABLE), expecting function (T_FUNCTION) or const I would pay for help here.
    Reviewed by cwtudor at 2022-04-16 15:02
  • 15. Files larger than 100MB get resized to 0 byte after uploading

    Hola! Files larger than 100MB approx. get uploaded BUT resized to 0 bytes. Uploading process runs apparently correctly - it takes time to upload according to file size - but after reaching 100% and the file is listed then you can see it was resized to 0 bytes. Uploading works fine with smaller files. By checking at a given error log file I found the following log: PHP Fatal error: Uncaught Exception: Csrf token not valid in /home/user/public_html/filegator/backend/Services/Security/Security.php:46 I already tried setting 'csrf_protection' to "false" in Configuration.php but it didn't work. Filegator is installed on a shared hosting environment with the following PHP 7.4 FPM configuration max possible values: max_execution_time and max_input_time = 300 max_input_vars = 1500 memory_limit = 256M post_max_size = 512M upload_max_filesize = 512M

    Any ideas what should be causing this issue? Thank you so very much in advance for your kind attention and help.

    Reviewed by jmestradave at 2022-04-12 19:39
  • 16. Bug report

    Describe the bug I set up a default container with your example Dockerfile on our Kubernetes infrastructure. We have a preconfigured NFS storage on an other system which brings a small delay between the K8S and the filesystem. When I now try to update a user credential or adding a new user to the system I see some pending requests. A soon this requests are pending it is not possible to interact further with the app. Could it be that the storage implementation is not ready to do async file operations to save the json files? Because everything else including the logs etc are working as expected.

    To Reproduce Steps to reproduce the behavior:

    1. Configure a default Instance with the default Dockerfile on a shared Cluster i.e.
    2. Connect the private volume with an NFS storage system (maybe also other systems)
    3. Try to change your password or adding additional users
    4. Open the Browser-Dev tools and you will see pending requsts

    Expected behavior The password of the user should be changed and the user should get logged out as it happens on a local storage mount.

    Screenshots image

    Environment (please complete the following information):

    • FileGator Version [7.7.2]
    • PHP/Apache [php:7-apache-buster]
    • Browser [edge/chrome]
    Reviewed by matthiasbaldi at 2022-03-15 14:41
PictShare is an open source image, mp4, pastebin hosting service with a simple resizing and upload API that you can host yourself.
PictShare is an open source image, mp4, pastebin hosting service with a simple resizing and upload API that you can host yourself.

PictShare is an open source image, mp4, pastebin hosting service with a simple resizing and upload API that you can host yourself.

May 17, 2022
A Flysystem proxy adapter that enables compression and encryption of files and streams on the fly

Slam / flysystem-compress-and-encrypt-proxy Compress and Encrypt files and streams before saving them to the final Flysystem destination. Installation

Mar 10, 2022
A web based file manager,web IDE / browser based code editor
A web based file manager,web IDE / browser based code editor

KodExplorer Update to kodbox: https://github.com/kalcaddle/kodbox Download | Demo It is recommended to use a new design upgrade product:kodbox 该项目处于维护

May 28, 2022
This small PHP package assists in the loading and parsing of VTT files.

VTT Transcriptions This small PHP package assists in the loading and parsing of VTT files. Usage use Laracasts\Transcriptions\Transcription; $transcr

May 27, 2022
PHP library that provides a filesystem abstraction layer − will be a feast for your files!

Gaufrette Gaufrette provides a filesystem abstraction layer. Why use Gaufrette? Imagine you have to manage a lot of medias in a PHP project. Lets see

May 11, 2022
PHP runtime & extensions header files for PhpStorm

phpstorm-stubs STUBS are normal, syntactically correct PHP files that contain function & class signatures, constant definitions, etc. for all built-in

May 25, 2022
ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files.

ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It's widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build parse trees and also generates a listener interface (or visitor) that makes it easy to respond to the recognition of phrases of interest.

May 23, 2022
Tailwind plugin to generate purge-safe.txt files
Tailwind plugin to generate purge-safe.txt files

Tailwind plugin to generate safelist.txt files With tailwind-safelist-generator, you can generate a safelist.txt file for your theme based on a set of

May 14, 2022
Associate files with Eloquent models
Associate files with Eloquent models

Associate files with Eloquent models This package can associate all sorts of files with Eloquent models. It provides a simple API to work with. To lea

May 24, 2022
This package used to upload files using laravel-media-library before saving model.
This package used to upload files using laravel-media-library before saving model.

Laravel Media Uploader This package used to upload files using laravel-media-library before saving model. In this package all uploaded media will be p

May 8, 2022
A python program to cut longer MP3 files (i.e. recordings of several songs) into the individual tracks.

I'm writing a python script to cut longer MP3 files (i.e. recordings of several songs) into the individual tracks called ReCut. So far there are two

Oct 27, 2021
FileNamingResolver - A lightweight library which helps to resolve a file/directory naming of uploaded files using various naming strategies

FileNamingResolver - A lightweight library which helps to resolve a file/directory naming of uploaded files using various naming strategies

May 19, 2022
kodbox is a file manager for web. It is a newly designed product based on kodexplorer.
kodbox is a file manager for web. It is a newly designed product based on kodexplorer.

kodbox is a file manager for web. It is a newly designed product based on kodexplorer. It is also a web code editor, which allows you to develop websites directly within the web browser.You can run kodbox either online or locally,on Linux, Windows or Mac based platforms

May 21, 2022
Private file storage and share with user build with laravel and vue inspired by google drive
Private file storage and share with user build with laravel and vue inspired by google drive

LaravelDrive is a file storage system that allows store private file and share with users build wiht laravel and vue inspired by google drive. Laravel

May 17, 2022
Laravel Flysystem was created by, and is maintained by Graham Campbell, and is a Flysystem bridge for Laravel.
Laravel Flysystem was created by, and is maintained by Graham Campbell, and is a Flysystem bridge for Laravel.

Laravel Flysystem Laravel Flysystem was created by, and is maintained by Graham Campbell, and is a Flysystem bridge for Laravel. It utilises my Larave

Feb 4, 2022
Abstraction for local and remote filesystems

League\Flysystem About Flysystem Flysystem is a file storage library for PHP. It provides one interface to interact with many types of filesystems. Wh

May 22, 2022
Detects file type by filename or content and generates correct mimetype.

FileTypeDetector Files type detector based on file name extension or file content (binary content). Usage Installation Supported formats Usage File Ty

Apr 18, 2022