Prodotto — FluxFiles

Funzionalità

Tutto ciò che serve a un file manager moderno

Progettato per sviluppatori che necessitano di flessibilità.

Multi-storage

Locale, AWS S3, Cloudflare R2, SFTP tramite Flysystem v3 — cambia con la config, senza codice.

Integra ovunque

iframe + SDK postMessage. UI standalone con Alpine.js (zero build). Con qualsiasi framework.

Auth JWT + scoping

Prefisso percorso per utente, permessi, whitelist dischi, modalità solo proprietario — o parti da un preset di ruolo viewer/editor/admin.

Preset di ruolo ACL

Emetti token da preset viewer/editor/admin/superadmin — un solo parametro espande i claim corretti di permessi, disco e ambito invece di assemblarli a mano.

AI auto-tag

Claude / OpenAI vision — alt text, titolo, tag automatici.

Ritaglio immagine

Strumento di ritaglio con proporzioni predefinite.

Ottimizzazione immagine

Varianti WebP automatiche — miniatura, medio, grande.

Upload pre-firmati

Il browser carica direttamente su S3/R2 — zero bandwidth sul tuo server.

Upload a blocchi

S3 multipart per file > 10MB.

Ricerca full-text

Ricerca indicizzata per nomi, titoli, tag — basata su file di default, oppure un tuo database SQL come backend opzionale.

Metadati su database

Modalità opzionale FLUXFILES_STORAGE_BACKEND=db — metadati, indice di ricerca/cartelle e log di audit vivono nel tuo database MySQL/PostgreSQL/SQLite invece che in file JSON. I byte dei file restano comunque nello storage.

Operazioni in blocco

Selezione multipla: spostare, copiare, eliminare, scaricare.

Trasferimento cross-disk

Copia/sposta tra Locale ↔ S3 ↔ R2.

Cestino

Eliminazione recuperabile con pulizia automatica.

Metadati SEO

Titolo, alt, didascalia, tag — metadati oggetto S3 (cloud) o JSON sidecar (locale). Ricerca full-text.

Modalità scura

Chiaro / scuro / auto in UI e SDK.

16 lingue

Inglese predefinito. Imposta locale via SDK, URL (?locale=) o FLUXFILES_LOCALE. RTL per arabo.

Log di audit

Tutte le azioni di scrittura registrate.

Limitazione della velocità

Token bucket per utente per la protezione API.

Quota di archiviazione

Limiti per utente tramite JWT claims.

Bucket BYOB

Gli utenti portano il proprio S3/R2 — credenziali criptate nel JWT (AES-256-GCM).

Rilevamento duplicati

Match SHA-256 salta upload ridondanti salvo sovrascrittura forzata.

Refresh token SDK

onTokenRefresh su 401 — refresh coalescente, retry e updateToken().

Bucket Doctor

Diagnostica qualsiasi disco S3/R2 — credenziali, lettura/scrittura/eliminazione, presign, CORS, multipart — con correzioni IAM e CORS pronte da incollare. Onboarding dei bucket BYOB in pochi minuti.

Disco SFTP

Un 3° driver dopo S3/R2 — trasforma qualsiasi VPS o hosting in file manager.

Editor codice / config

Modifica file di testo e config (wp-config.php, .env) nel browser, stile cPanel.

Zip ed Estrai

Scarica una selezione come zip o estrai un archivio — protetto da zip-slip e bombe.

Filigrana

Applica una filigrana testo o logo al volo per la protezione — l'originale resta intatto.

WebP + AVIF on-demand

Servi qualsiasi dimensione d'immagine come AVIF/WebP in cache tramite un solo URL (negoziato da Accept), con srcset responsive pronto.

Permessi SFTP

Cambia i permessi Unix (chmod) sui dischi SFTP con un dialogo stile cPanel.

Terminale SSH

Un terminale di esecuzione comandi stateless sui dischi SFTP — strumento di amministrazione in stile cPanel, incluso e gratuito (oppure integra il tuo ttyd per un PTY completo).

Deploy Git con un clic

Fai pull e reset di un repo Git sul tuo server SFTP direttamente dal file manager — forma fissa, non una shell arbitraria, hook disattivati di default.

Dashboard di utilizzo

Vedi lo storage a colpo d'occhio — quota e suddivisione per tipo e cartella.

Anteprima media

Anteprima inline di immagini, video, audio e PDF; media locali privati in streaming sicuro.

Installazione rapida

Pronto in 2 minuti

composer require fluxfiles/fluxfiles
cp .env.example .env

# .env
FLUXFILES_SECRET=your-random-32-char-secret
FLUXFILES_ALLOWED_ORIGINS=https://yourapp.com

require_once 'vendor/autoload.php';

$token = fluxfiles_token(
    userId: 'user-123',
    perms: ['read', 'write', 'delete'],
    disks: ['local', 's3', 'r2'],
    prefix: 'user-123/',
    maxUploadMb: 10,
    allowedExt: null,
    ttl: 3600
);
composer require fluxfiles/laravel
php artisan vendor:publish --tag=fluxfiles-config

# .env — point the adapter at your FluxFiles server
FLUXFILES_ENDPOINT=https://fm.yourdomain.com
FLUXFILES_SECRET=your-secret-min-32-chars

# Optional: match CORS on the FluxFiles host
# FLUXFILES_ALLOWED_ORIGINS=https://yourapp.com

# Config: config/fluxfiles.php
npm install @fluxfiles/node

// Express / Next.js route — mint a token from your JS backend (no PHP)
import { createToken } from '@fluxfiles/node';

app.get('/fluxfiles-token', (req, res) => {
    const token = createToken({
        secret: process.env.FLUXFILES_SECRET, // >= 32 bytes
        userId: req.user.id,
        perms: ['read', 'write', 'delete'],
        prefix: `users/${req.user.id}`,
        ttl: 3600,
    });
    res.json({ token });
});
pip install fluxfiles-token

# FastAPI / Django / Flask route — mint a token from your Python backend (no PHP)
from fluxfiles_token import create_token

@app.get("/fluxfiles-token")
def fluxfiles_token(user=Depends(current_user)):
    token = create_token(
        secret=os.environ["FLUXFILES_SECRET"],  # >= 32 bytes
        user_id=user.id,
        perms=["read", "write", "delete"],
        prefix=f"users/{user.id}",
        ttl=3600,
    )
    return {"token": token}
<!-- Demo: unpkg. In production, serve fluxfiles.js from your FluxFiles host -->
<script src="https://unpkg.com/fluxfiles@latest/fluxfiles.js"></script>

<script>
FluxFiles.open({
    endpoint: 'https://your-api.com',
    token: 'eyJhbGci...',
    disk: 'local',
    mode: 'picker',
    container: '#file-picker',
    onSelect: function(file) {
        console.log('Selected:', file.url);
    },
    async onTokenRefresh() {
        const r = await fetch('/api/auth/refresh-fluxfiles-token');
        const { token } = await r.json();
        return token;
    }
});
</script>
npm install @fluxfiles/react

import { FluxFilesModal } from '@fluxfiles/react';

<FluxFilesModal
    open={open}
    endpoint="https://your-api.com"
    token={token}
    onSelect={(file) => console.log(file)}
    onClose={() => setOpen(false)}
/>
npm install @fluxfiles/vue

<script setup>
import { FluxFilesModal } from '@fluxfiles/vue';
</script>

<FluxFilesModal
    v-model:open="open"
    endpoint="https://your-api.com"
    :token="token"
    @select="onSelect"
    @close="open = false"
/>
git clone https://github.com/thai-pc/fluxfiles.git
docker build -f fluxfiles/docker/Dockerfile.prod -t fluxfiles fluxfiles

docker run -p 8080:80 \\
  -e FLUXFILES_SECRET=your-random-32-char-secret \\
  fluxfiles

# UI: http://localhost:8080/public/index.html
git clone https://github.com/thai-pc/fluxfiles.git
cd fluxfiles
composer install -d packages/core
cp .env.example .env

cd packages/core
php -S localhost:8080 router.php

# UI:  http://localhost:8080/public/index.html
# API: http://localhost:8080/api/fm/list?disk=local&path=

Funziona con

Laravel WordPress React / Next.js Vue / Nuxt CKEditor 4 TinyMCE Summernote Any framework

Integrazioni

Adattatori pronti all'uso per il tuo stack

Gli adattatori ufficiali integrano FluxFiles in modo nativo nei framework e negli editor che usi già.

Laravel
PHP
WordPress
Plugin
React
Component
Vue / Nuxt
Component
CKEditor 4
Plugin
TinyMCE
Plugin
Summernote
Plugin

Incorpora

Incorporalo in poche righe

Carica fluxfiles.js, passa un JWT generato lato server e inserisci un file manager completo — o una finestra di selezione file — in qualsiasi pagina.

<script src="https://fm.example.com/fluxfiles.js"></script>

FluxFiles.open({
  endpoint: 'https://fm.example.com',
  token: 'eyJhbGci...',   // JWT from your backend
  disk: 'local',
  mode: 'picker',         // select & close
  theme: 'auto',
  onSelect(file) {
    // { url, key, name, size, disk, meta, variants }
    document.querySelector("#img").src = file.url;
  },
});
<div id="fm" style="height:600px"></div>

FluxFiles.open({
  endpoint: 'https://fm.example.com',
  token: 'eyJhbGci...',
  mode: 'browser',          // full manager, stays open
  container: '#fm',         // omit for a modal overlay
  disks: ['local', 's3', 'r2'],
});

FluxFiles.on('FM_EVENT', (e) => console.log(e.event));
FluxFiles.navigate('/photos/2024');
import { FluxFilesModal } from '@fluxfiles/react';

function Picker({ open, setOpen, token }) {
  return (
    <FluxFilesModal
      open={open}
      endpoint="https://fm.example.com"
      token={token}
      onSelect={(file) => console.log(file.url)}
      onClose={() => setOpen(false)}
    />
  );
}

I token vengono generati lato server — non inviare mai il tuo secret al browser.

Perché FluxFiles

Progettato per ciò che gli altri hanno dimenticato

Scorri per confrontare
Funzionalità FluxFiles elFinder Laravel-FM RichFilemanager Responsive FM
S3 + R2 + Locale + SFTP
Integra in qualsiasi framework
Auth JWT + scoping
Metadati SEO
AI auto-tag
Ritaglio immagine
Upload a blocchi
Ricerca full-text
Modalità scura
16 lingue
PHP ≥ 8.1
Mantenuto attivamente
UI moderna
Capacità FluxFiles Filestack Uploadcare Cloudinary Supabase Storage
Self-hosted (gira nella tua infrastruttura)
BYOB — bucket proprio di ogni cliente
UI file manager incorporabile
Open source (MIT)
Nessun costo SaaS per storage / per upload
Multi-storage (S3 / R2 / locale)
Scoping del token per tenant integrato

Il confronto riflette le offerte predefinite tipiche; ogni prodotto eccelle nel proprio ambito. La nicchia di FluxFiles è la combinazione incorporabile, self-hosted e bring-your-own-bucket.

Confronto aggiornato al September 2026, indipendente — consulta il repository GitHub per segnalare una correzione.

FAQ

Domande frequenti

Come funziona l'autenticazione?
JWT stateless (HS256): generi un token lato server con claim granulari (permessi, dischi, ambito del percorso, limiti), così ogni utente vede solo ciò che permetti.
I miei utenti hanno bisogno di un account FluxFiles?
No. FluxFiles si fida del JWT emesso dalla tua app, quindi si collega alla tua autenticazione esistente — nessun sistema utenti separato.
Cosa serve per eseguirlo?
PHP 8.1+ con alcune estensioni comuni e Composer. Puntalo a un disco, imposta un secret e le origini consentite, poi avvialo — gira su un piccolo VPS.
Utenti diversi possono avere permessi diversi?
Sì. Genera un token con claim granulari (lettura/scrittura/eliminazione, disco, prefisso del percorso, limiti di upload, estensioni consentite, owner-only), oppure usa uno dei quattro ruoli predefiniti — viewer, editor, admin, superadmin — per delimitare un token in una riga invece di elencare ogni claim a mano.
Devo gestire un database?
No. Per impostazione predefinita tutti i metadati (info file, indice di ricerca, log di audit) vivono accanto ai tuoi file come JSON di supporto — niente di extra da provisionare o backuppare. Se preferisci tenere questa contabilità nel tuo MySQL, PostgreSQL o SQLite, una modalità opzionale FLUXFILES_STORAGE_BACKEND=db la sposta lì; i byte dei file restano comunque sempre nel tuo storage.
Ci sono limiti di utilizzo?
Il core in sé non impone limiti artificiali — nessun tetto di utenti attivi mensili, nessun invito forzato all'upgrade. Sei tu a impostare i tuoi limiti tramite i claim JWT: quote di storage per utente, restrizioni su dimensione/estensione degli upload, e un rate limiter integrato (60 letture / 10 scritture al minuto di default, configurabile).