Produit — FluxFiles

Fonctionnalités

Tout ce dont un gestionnaire de fichiers moderne a besoin

Conçu pour les développeurs qui ont besoin de flexibilité.

Multi-stockage

Local, AWS S3, Cloudflare R2, SFTP via Flysystem v3 — changez par la config, sans modifier le code.

Intégration partout

iframe + SDK postMessage. L'UI autonome utilise Alpine.js (zéro build). Compatible avec tout framework.

Auth JWT + portée

Préfixe de chemin par utilisateur, permissions, liste blanche de disques, mode owner-only — ou partez d'un préréglage de rôle viewer/editor/admin.

Préréglages de rôle ACL

Émettez des tokens à partir de préréglages viewer/editor/admin/superadmin — un seul paramètre déploie les bons claims de permission, disque et portée au lieu de les assembler à la main.

AI auto-tag

Claude / OpenAI vision — alt texte, titre, tags automatiques.

Recadrage d'image

Outil de recadrage avec ratios prédéfinis.

Optimisation d'image

Variantes WebP automatiques — miniature, moyen, grand.

Uploads présignés

Le navigateur uploade directement vers S3/R2 — zéro bande passante serveur.

Upload par morceaux

S3 multipart pour fichiers > 10Mo.

Recherche plein texte

Recherche indexée par noms, titres, tags — basée fichier par défaut, ou votre propre base de données SQL en option.

Métadonnées adossées à une BD

Mode optionnel FLUXFILES_STORAGE_BACKEND=db — métadonnées, index de recherche/dossiers et journal d'audit vivent dans votre propre base MySQL/PostgreSQL/SQLite au lieu de fichiers JSON. Les octets des fichiers restent stockés côté stockage dans les deux cas.

Opérations en masse

Sélection multiple : déplacer, copier, supprimer, télécharger.

Transfert cross-disk

Copier/déplacer entre Local ↔ S3 ↔ R2.

Corbeille

Suppression réversible avec purge automatique.

Métadonnées SEO

Titre, alt, légende, tags — métadonnées objet S3 (cloud) ou JSON sidecar (local). Recherche plein texte.

Mode sombre

Clair / sombre / auto dans l'UI et le SDK.

16 langues

Anglais par défaut. Définissez la locale via SDK, URL (?locale=) ou FLUXFILES_LOCALE. RTL pour l'arabe.

Journal d'audit

Toutes les actions d'écriture enregistrées.

Limitation de débit

Token bucket par utilisateur pour la protection API.

Quota de stockage

Limites par utilisateur via JWT claims.

Buckets BYOB

Les utilisateurs apportent leur S3/R2 — identifiants chiffrés dans le JWT (AES-256-GCM).

Détection des doublons

Correspondance SHA-256 — ignore les uploads redondants sauf écrasement forcé.

Rafraîchissement du token SDK

onTokenRefresh sur 401 — refresh fusionné, retry, et updateToken() pour rotation proactive.

Bucket Doctor

Diagnostique n’importe quel disque S3/R2 — identifiants, lecture/écriture/suppression, presign, CORS, multipart — avec des correctifs IAM et CORS prêts à coller. Intégrez un bucket BYOB en quelques minutes.

Disque SFTP

Un 3ᵉ pilote après S3/R2 — transformez tout VPS ou hébergement en gestionnaire.

Éditeur code / config

Éditez fichiers texte et config (wp-config.php, .env) dans le navigateur, façon cPanel.

Zip & Extraction

Téléchargez une sélection en zip ou extrayez sur place — anti zip-slip & bombe.

Filigrane

Appliquez un filigrane texte ou logo à la volée — le fichier source reste intact.

WebP + AVIF à la demande

Servez toute taille d'image en AVIF/WebP mis en cache via une seule URL (négociée par Accept), avec srcset responsive prêt.

Permissions SFTP

Modifiez les permissions Unix (chmod) sur disques SFTP via une boîte façon cPanel.

Terminal SSH

Un terminal d'exécution de commandes sans état sur disques SFTP — outil d'admin façon cPanel, intégré et gratuit (ou intégrez votre propre ttyd pour un vrai PTY).

Déploiement Git en un clic

Pull et reset d'un dépôt Git sur votre serveur SFTP directement depuis le gestionnaire de fichiers — forme fixe, pas de shell arbitraire, hooks désactivés par défaut.

Tableau de bord d'usage

Visualisez le stockage d'un coup d'œil — quota et répartition par type et dossier.

Aperçu média

Aperçu image, vidéo, audio & PDF en ligne ; médias locaux privés diffusés en sécurité.

Installation rapide

Opérationnel en 2 minutes

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=

Compatible avec

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

Intégrations

Des adaptateurs prêts à l'emploi pour votre stack

Les adaptateurs officiels intègrent nativement FluxFiles aux frameworks et éditeurs que vous utilisez déjà.

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

Intégration

Intégrez-le en quelques lignes

Chargez fluxfiles.js, passez un JWT généré côté serveur, et insérez un gestionnaire de fichiers complet — ou une fenêtre de sélection — dans n'importe quelle page.

<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)}
    />
  );
}

Les jetons sont générés côté serveur — n'envoyez jamais votre secret au navigateur.

Pourquoi FluxFiles

Conçu pour ce que les autres ont oublié

Glissez pour comparer
Fonctionnalité FluxFiles elFinder Laravel-FM RichFilemanager Responsive FM
S3 + R2 + Local + SFTP
Intégration tout framework
Auth JWT + portée
Métadonnées SEO
AI auto-tag
Recadrage d'image
Upload par morceaux
Recherche plein texte
Mode sombre
16 langues
PHP ≥ 8.1
Maintenance active
UI moderne
Capacité FluxFiles Filestack Uploadcare Cloudinary Supabase Storage
Auto-hébergé (tourne dans votre infra)
BYOB — le bucket de chaque client
UI de gestion de fichiers intégrable
Open source (MIT)
Aucun frais SaaS au stockage / à l’upload
Multi-stockage (S3 / R2 / local)
Portée de jeton par locataire intégrée

Le comparatif reflète les offres par défaut habituelles ; chaque produit excelle dans son domaine. La niche de FluxFiles est la combinaison intégrable, auto-hébergée et bring-your-own-bucket.

Comparaison à jour au September 2026, réalisée de manière indépendante — consultez le dépôt GitHub pour signaler une correction.

FAQ

Questions fréquentes

Comment fonctionne l'authentification ?
JWT sans état (HS256) : vous générez un jeton côté serveur avec des revendications fines (permissions, disques, portée de chemin, limites), de sorte que chaque utilisateur ne voit que ce que vous autorisez.
Mes utilisateurs ont-ils besoin d'un compte FluxFiles ?
Non. FluxFiles fait confiance au JWT émis par votre propre application, donc il se branche sur votre authentification existante — aucun système d'utilisateurs séparé.
De quoi ai-je besoin pour l'exécuter ?
PHP 8.1+ avec quelques extensions courantes et Composer. Pointez-le vers un disque, définissez un secret et les origines autorisées, puis lancez-le — il tourne sur un petit VPS.
Différents utilisateurs peuvent-ils avoir des permissions différentes ?
Oui. Générez un token avec des claims fins (lecture/écriture/suppression, disque, préfixe de chemin, limites d'upload, extensions autorisées, owner-only), ou utilisez l'un des quatre rôles prédéfinis — viewer, editor, admin, superadmin — pour délimiter un token en une ligne plutôt que d'énumérer chaque claim à la main.
Ai-je besoin de faire tourner une base de données ?
Non. Par défaut, toutes les métadonnées (infos fichier, index de recherche, journal d'audit) vivent à côté de vos fichiers sous forme de JSON annexes — rien de plus à provisionner ou sauvegarder. Si vous préférez conserver cette comptabilité dans votre propre base MySQL, PostgreSQL ou SQLite, un mode optionnel FLUXFILES_STORAGE_BACKEND=db l'y déplace ; les octets des fichiers restent toujours dans votre stockage.
Y a-t-il des limites d'utilisation ?
Le core lui-même n'impose aucune limite artificielle — pas de plafond d'utilisateurs actifs mensuels, pas d'incitation forcée à la mise à niveau. Vous fixez vos propres limites via les claims JWT : quotas de stockage par utilisateur, restrictions de taille/extension d'upload, et un limiteur de débit intégré (60 lectures / 10 écritures par minute par défaut, configurable).