Paket Laravel File Manager berbasis Laravel Storage / Flysystem yang diadaptasi dari Responsive Filemanager dengan antarmuka yang modern, cepat, responsif, dan terintegrasi mulus dengan ekosistem OpenSID serta Laravel 11/12+.
- π Integrasi Flysystem Penuh: Menggunakan disk storage bawaan Laravel (
local,public,s3, dll.). - π Navigasi Cepat & Ringan: Pemuatan berkas instan dengan lookup hash map
$O(1)$ dan script defer. - π Pratinjau Dokumen PDF: Mendukung pratinjau (preview) dokumen PDF langsung di dalam antarmuka dengan modal lightbox Featherlight.
- πΌοΈ Pengelolaan Gambar & Thumbnail: Pratinjau gambar responsif, potong/edit gambar, dan pembuatan thumbnail otomatis menggunakan
spatie/image. - π¨ Antarmuka Modern & Rapi: Tampilan slate clean, sudut rounded presisi (5px), floating tooltip bebas overflow, dan breadcrumb navigasi yang selaras.
- ποΈ Fitur Manajemen Berkas Lengkap: Unggah berkas, buat folder, ubah nama, duplikasi berkas, salin/potong (copy/cut/paste), pengurutan (sorting), serta pencarian berkas secara realtime.
- π Integrasi Rich Text Editor: Kompatibel dengan TinyMCE, CKEditor, Summernote, maupun pemanggilan via popup mandiri (standalone modal/iframe).
Pasang paket melalui Composer:
composer require opensid/laravel-filemanagerPublikasikan file konfigurasi dan aset (opsional/jika diperlukan):
# Publikasikan konfigurasi
php artisan vendor:publish --tag=filemanager-config
# Publikasikan asset frontend (CSS, JS, Icons)
php artisan vendor:publish --tag=filemanager-assets
# Publikasikan view template
php artisan vendor:publish --tag=filemanager-viewsSetelah mempublikasikan file konfigurasi, Anda dapat menyesuaikan pengaturan pada config/filemanager.php:
return [
/*
|--------------------------------------------------------------------------
| Default Disk
|--------------------------------------------------------------------------
| Tentukan disk storage Laravel yang akan digunakan sebagai root filemanager.
*/
'disk' => env('FILEMANAGER_DISK', 'public'),
/*
|--------------------------------------------------------------------------
| Base Folder
|--------------------------------------------------------------------------
| Folder dasar di dalam disk tempat file akan dikelola.
*/
'base_folder' => env('FILEMANAGER_BASE_FOLDER', 'desa/upload'),
/*
|--------------------------------------------------------------------------
| Routes & Middleware
|--------------------------------------------------------------------------
*/
'route_prefix' => 'filemanager',
'middleware' => ['web', 'auth'],
];Akses route dialog filemanager melalui iframe atau popup browser:
<a href="/filemanager/dialog?type=0&field_id=target_input" class="btn btn-primary" target="_blank">
Buka File Manager
</a>tinymce.init({
selector: '#editor',
plugins: 'image link media',
file_picker_callback: function (callback, value, meta) {
var x = window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth;
var y = window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight;
var type = 0;
if (meta.filetype === 'image') type = 1;
if (meta.filetype === 'media') type = 3;
var cmsURL = '/filemanager/dialog?type=' + type + '&editor=tinymce';
tinymce.activeEditor.windowManager.openUrl({
url: cmsURL,
title: 'File Manager',
width: x * 0.8,
height: y * 0.8,
onMessage: function (api, message) {
callback(message.content);
}
});
}
});CKEDITOR.replace('editor', {
filebrowserBrowseUrl: '/filemanager/dialog?type=2&editor=ckeditor',
filebrowserImageBrowseUrl: '/filemanager/dialog?type=1&editor=ckeditor',
filebrowserUploadUrl: '/filemanager/upload'
});Setiap pembuatan folder baru di filemanager secara otomatis menyertakan berkas .htaccess dan index.html yang telah diperkuat (hardened) untuk memblokir eksekusi skrip PHP, CGI, ASP, shell, HTML/SVG, dan indeks direktori. Berkas .htaccess hanya satu lapis β Nginx & OpenLiteSpeed mode native mengabaikannya, jadi konfigurasi server tetap wajib (lihat di bawah).
.htaccess hanya ditulis saat folder dibuat oleh package ini. Untuk instalasi hasil migrasi dari rfm/ lama, atau folder yang dibuat manual, jalankan sekali:
php artisan filemanager:hardenPerintah ini menimpa .htaccess + index.html di root disk dan seluruh sub-folder (disk utama & disk thumbnail). Aman diulang β selalu menimpa, tidak menambah.
Konfigurasi .htaccess otomatis aktif dengan aturan:
<FilesMatch>case-insensitive(?i)mencakupphp,php[0-9]*,phtml,phtm,phps,pht,phar,inc,module,htm(l),svg, shell/CGI β denganRequire all denied&Deny from allRewriteRulepenolakan instan[F,L]RemoveHandler+RemoveType+AddType text/plain,SetHandler None,ForceType text/plainOptions -ExecCGI -Indexesphp_flag engine off(mod_php 5/7/8)X-Content-Type-Options: nosniffuntuk semua berkas;Content-Disposition: attachment+Content-Security-Policyuntuk.svg/.xml/.html
Nginx tidak membaca .htaccess. Tambahkan pada blok server situs Anda, dan pastikan location ~ \.php$ hanya meng-cover root aplikasi, bukan folder unggahan:
# Tolak eksekusi & sniffing skrip di seluruh pohon unggahan
location ~* ^/(desa/upload|assets|storage)/ {
add_header X-Content-Type-Options "nosniff" always;
location ~* \.(php|php[0-9]*|phtml|phtm|phps|pht|phar|inc|module|pl|py|cgi|sh|bash|asp|aspx|jsp|exe|bat|cmd|env|htaccess|htpasswd)$ {
deny all;
return 403;
}
# SVG/HTML: paksa unduh, jangan render inline
location ~* \.(svg|svgz|xml|x?html?)$ {
add_header X-Content-Type-Options "nosniff" always;
add_header Content-Disposition "attachment" always;
add_header Content-Security-Policy "default-src 'none'; style-src 'unsafe-inline'; sandbox" always;
}
}Selain .htaccess, di Virtual Host β Context tambahkan Static Context /desa/upload/ dengan Accessible: Yes lalu Rewrite rule:
RewriteRule (?i)\.(php|php[0-9]*|phtml|phtm|phps|pht|phar|inc|module|pl|py|cgi|sh|asp|jsp|exe|bat|env)$ - [F,L]
Whitelist extensions di config/filemanager.php sengaja dipangkas ke format yang dipakai desa dan yang tanda-tangan (magic byte)-nya bisa diverifikasi oleh FileContentValidator. Menambah ekstensi non-gambar yang tidak punya signature akan otomatis ditolak saat unggah.
svg tidak ada di whitelist bawaan (risiko stored XSS β SVG adalah dokumen XML yang bisa memuat <script>/<style>/event handler). Jika benar-benar butuh SVG, tambahkan pustaka sanitasi khusus (enshrined/svg-sanitize) dan pastikan header nosniff + Content-Disposition: attachment aktif untuk folder media.
Kontribusi selalu terbuka untuk perbaikan bug, peningkatan performa, dan fitur baru!
- Fork repositori ini
- Buat branch fitur Anda (
git checkout -b feature/fitur-baru) - Commit perubahan Anda (
git commit -m 'feat: tambah fitur baru') - Push ke branch Anda (
git push origin feature/fitur-baru) - Ajukan Pull Request
Paket ini dirilis di bawah lisensi GPL-3.0-or-later. Hak Cipta Β© Perkumpulan Desa Digital Terbuka (OpenDesa).