v0.2 — 开源 · MIT 许可证

可嵌入任何地方的文件管理器

PHP ≥ 8.1 + Flysystem 3。Alpine.js 界面。Local、S3、Cloudflare R2、SFTP。几行 JavaScript 即可嵌入。

PHP ≥ 8.1
无需框架
~3 KB
SDK包大小
MIT
开源许可证
16
支持语言
预览

查看实际效果

Creating a FluxFiles share link with an expiry, a password and a download limit
分享文件 — 有效期、密码、下载上限
Creating a FluxFiles upload portal with a file limit, size cap and allowed file types
上传门户 — 客户无需账号即可发送文件
FluxFiles links panel listing shared links with views, downloads and revoke
管理所有链接,随时撤销
FluxFiles desktop file manager with image thumbnails
网格视图,即时 WebP 缩略图
FluxFiles browsing an S3 / R2 bucket with the local, S3 and SFTP disk switcher
多云 — S3 / R2 / SFTP,统一界面
FluxFiles managing a remote VPS deploy directory over SFTP, same UI as the S3 bucket
通过 SFTP 管理远程 VPS — 无需 FTP 客户端
Editing an nginx config file inside FluxFiles with syntax highlighting
就地编辑配置文件 — 无需 SSH 或 FTP
FluxFiles previewing a video inline in the detail panel
无需下载即可预览视频、音频和 PDF
FluxFiles Bucket Doctor health checks for an S3 bucket with CORS and IAM remediation
存储桶体检 — S3/R2 健康检查 + 修复
FluxFiles activity log of file operations
活动日志 — 存于你自己的存储桶
FluxFiles trash with restore and delete forever
回收站 — 恢复或永久删除
FluxFiles responsive mobile file manager
移动端自适应
护城河 · BYOB

客户的文件留在客户自己的存储桶里

FluxFiles 是可嵌入的文件管理器:每个租户接入自己的 S3/R2 存储桶——你永远不存储他们的数据或凭证。

  • 数据主权

    文件存放在客户自己的云账户与区域——契合 GDPR、合规与企业采购。

  • 静态不留数据、不留凭证

    存储桶凭证以 AES-256-GCM 加密在 JWT 中,仅在运行时解密——绝不写入数据库或日志。

  • 存储成本可归零

    存储与出口流量由各客户承担,而非你。账单不会随用户增长而膨胀。

  • 无状态且可嵌入

    无中心数据库。通过 iframe 或 SDK 把选择器嵌入任意应用;由你的后端签发受限的短时令牌。

你的 SaaS 应用
受限 JWT(加密凭证)
FluxFiles
仅运行时解密
租户 A
自有存储桶
租户 B
自有存储桶
租户 C
自有存储桶

工作原理:你的应用把租户的存储桶凭证加密进一个短时 JWT(HKDF-SHA256 + AES-256-GCM)。FluxFiles 仅为执行所请求的操作而解密。

多租户

每个租户一个令牌 —— 各有各的规则

FluxFiles 无状态:后端签发的 JWT 就是该租户的配置。存储路径、单文件大小、配额、文件数量、允许类型、权限 —— 全部在服务端强制执行。无需为每个租户准备配置文件,无需重启。

// Your backend, per request — the token IS the tenant's config.
import { createToken } from '@fluxfiles/node';

const claims = tenant.plan === 'pro'
  // 100 MB/file · any type · 50 GB · unlimited files · own bucket
  ? { disks: ['s3'],    maxUploadMb: 100, allowedExt: null,
      maxStorageMb: 51200, maxFiles: 0 }
  // 5 MB/file · images only · 500 MB · 200 files
  : { disks: ['local'], maxUploadMb: 5,   allowedExt: ['jpg','png','webp'],
      maxStorageMb: 500,   maxFiles: 200 };

const token = createToken({
  secret: process.env.FLUXFILES_SECRET,
  userId: tenant.id,
  prefix: `tenant_${tenant.id}/`,   // isolates each tenant's files
  perms:  ['read', 'write', 'delete'],
  ...claims,
});
prefix disks / BYOB max_upload max_storage max_files allowed_ext perms

搭配 BYOB,让每个租户使用自己的存储桶。

适合谁

为交付文件功能的团队而生

如果你的产品需要上传,FluxFiles 即插即用 —— 而不会让你成为客户数据的“房东”。

SaaS 与多租户应用

为每位客户提供基于自有存储桶的文件管理器。按租户的令牌限定与数据主权开箱即用。

代理商与自由职业者

为每个客户交付精致的媒体库,无需为每个项目搭建存储基础设施。

CMS 与编辑器集成

通过 iframe SDK 将媒体选择器嵌入 CKEditor、TinyMCE、Summernote 或你自己的编辑器。

内部工具与仪表板

一个下午即可为后台面板加上上传、预览和带审计的文件操作。

功能

现代文件管理器所需的一切

为需要灵活性的开发者而构建。

多存储

本地、AWS S3、Cloudflare R2, SFTP 通过 Flysystem v3 — 仅改配置即可切换。

嵌入任何地方

iframe + postMessage SDK。独立 UI 使用 Alpine.js(零构建)。适用于任何框架。

JWT认证 + 权限范围

每用户路径前缀、权限声明、磁盘白名单、仅所有者模式。

AI自动标签

Claude / OpenAI vision — 自动alt文本、标题、标签。

图片裁剪

内置裁剪工具,预设宽高比。

图片优化

自动WebP变体 — 缩略图、中等、大图。

预签名上传

浏览器直接上传到S3/R2 — 服务器零带宽消耗。

分片上传

S3 multipart,支持>10MB文件。

全文搜索

对文件名、标题、标签建立索引搜索 —— 基于文件,无需数据库。

批量操作

多选移动、复制、删除、下载。

跨磁盘传输

在本地 ↔ S3 ↔ R2之间复制/移动。

回收站

可恢复删除,自动清理。

SEO元数据

标题、alt、说明、标签 — 云端为 S3 对象元数据,本地为 sidecar JSON。全文搜索。

深色模式

UI 与 SDK 支持浅色 / 深色 / 自动。

16种语言

默认英语。通过 SDK、URL (?locale=) 或 FLUXFILES_LOCALE 设置语言。阿拉伯语 RTL。

审计日志

记录所有写入操作。

速率限制

每用户令牌桶API保护。

存储配额

通过JWT claims设置每用户限制。

BYOB 存储桶

用户自带 S3/R2 — 凭证在 JWT 中加密(AES-256-GCM)。

重复检测

SHA-256 相同则跳过重复上传,除非强制覆盖。

SDK 令牌刷新

401 时 onTokenRefresh — 合并刷新、重试,以及 updateToken() 主动轮换。

存储桶体检

诊断任意 S3/R2 磁盘——凭证、读/写/删、预签名、CORS、分片——并给出可直接粘贴的 IAM 与 CORS 修复方案。几分钟接入 BYOB 存储桶。

Node 令牌 SDK

用 @fluxfiles/node 从任意 JS 后端(Express、Next.js、Nuxt)签发 FluxFiles 令牌——与 PHP 核心逐字节兼容。签发令牌无需 PHP。

SFTP 磁盘

继 S3/R2 之后的第三种驱动——把任意 VPS 或共享主机变成文件管理器。

代码 / 配置编辑器

在浏览器中编辑文本与配置文件(wp-config.php、.env、nginx.conf),类 cPanel。

压缩与解压

将选中项打包为 zip,或就地解压——已防 zip-slip 与压缩炸弹。

水印

实时叠加文字或 Logo 水印以保护预览——绝不修改原文件。

按需 WebP + AVIF

通过一个 URL 以缓存的 AVIF/WebP 提供任意尺寸图片(按 Accept 协商),附带响应式 srcset。

SFTP 权限

用类 cPanel 对话框更改 SFTP 磁盘上的 Unix 文件权限(chmod)。

用量面板

一目了然的存储用量——配额加按类型和文件夹的细分。

媒体预览

内联预览图片、视频、音频与 PDF;私有本地媒体安全流式传输(支持 Range)。

快速安装

2分钟启动运行

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 });
});
<!-- 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=

兼容

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

集成

适配你技术栈的即插即用适配器

官方适配器可将 FluxFiles 原生嵌入你已经在用的框架和编辑器中。

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

嵌入

几行代码即可嵌入

加载 fluxfiles.js,传入由服务端签发的 JWT,即可把完整的文件管理器(或文件选择弹窗)放进任意页面。

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

令牌在服务端签发——切勿把密钥发送到浏览器。

为什么选择FluxFiles

为他人遗忘之处而构建

滑动查看对比
功能 FluxFiles elFinder Laravel-FM RichFilemanager Responsive FM
S3 + R2 + Local + SFTP
嵌入任何框架
JWT认证 + 权限范围
SEO元数据
AI自动标签
图片裁剪
分片上传
全文搜索
深色模式
16种语言
PHP ≥ 8.1
积极维护中
现代UI
对比文件 API SaaS

自托管且可嵌入——而非又一个上传 SaaS

托管文件 API 很好,但它们存储你的数据并按用量计费。FluxFiles 运行在你的技术栈中,每个租户使用自己的存储桶。

滑动查看对比
能力 FluxFiles Filestack Uploadcare Cloudinary Supabase Storage
自托管(运行在你的基础设施)
BYOB——每个客户自有存储桶
可嵌入的文件管理器 UI
开源(MIT)
无按存储/上传的 SaaS 费用
多存储(S3 / R2 / 本地)
内置按租户令牌作用域

对比反映各产品的典型默认能力;每款产品在各自领域都很出色。FluxFiles 的定位是可嵌入、自托管、自带存储桶三者的组合。

可售产品

不止管理文件——还能收发文件

免费核心嵌入文件管理器。付费模块把它变成客户愿意付费的产品。

Pro

Branded Share

向任意文件或文件夹发送带品牌的自助链接——含有效期、密码、下载上限和查看分析。你的 logo,你的域名。

  • 有效期/密码保护链接
  • 下载上限 + 查看分析
  • 范围令牌——收件人无需账号
Pro

Upload Portals

公开的“把文件发给我们”页面,直接落入你的存储。适合代理、摄影师和客户入驻——上传者无需账号。

  • 公开门户 → 你的存储桶
  • 每门户大小/类型/有效期限制
  • 匿名上传,按所有者范围控制
Enterprise

Compliance bundle

病毒扫描、C2PA 内容溯源和审计留存——面向受监管和企业部署。

WordPress

一个插件顶三个

在 WordPress 上,FluxFiles 既是客户文件门户,又是媒体管理器——取代单独的文件夹、云和卸载插件。

能力 FluxFiles FileBird WP Media Folder WP Offload
媒体文件夹
S3 / R2 / SFTP 存储
卸载 + URL 重写
客户上传门户
品牌分享链接
典型价格 一个许可证 $49/年 $69/年 付费

文件夹 + 云 + 卸载 + 客户门户合一——无需分别购买 FileBird、WP Media Folder 和 WP Offload。

价格

核心免费,只为付费模块付费。

MIT 核心永久免费。升级即可获得两大产品——品牌分享 + 上传门户——以及更多。

免费(核心)

$0 永久

完整的 MIT 文件管理器,自托管。

开始使用
  • Local / S3 / R2 / SFTP 存储,JWT 范围控制
  • 按需 WebP + AVIF + 图片/PDF 优化
  • 水印、版本钩子、用量面板、AI 自动标签
  • 7 个适配器 + BYO-embed 终端 / PDF / office / 电子签
最受欢迎

Pro

$79 /年

与客户收发文件。

即将推出即将推出
  • 包含免费版全部
  • 品牌分享——带有效期/密码/上限/分析的链接
  • 上传门户——公开“把文件发给我”,无需账号
  • 优先支持 + 更新

Studio

$299 /年

在 FluxFiles 上打造产品。

即将推出即将推出
  • 包含 Pro 全部
  • 版本管理 + Webhooks(Zapier/Make/n8n)
  • AI 视觉 + OCR(自带密钥)
  • 多租户权限分层 + 白标

Enterprise

定制

合规,规模化。

联系销售
  • 包含 Studio 全部
  • 病毒扫描 + C2PA 溯源 + 审计留存
  • SSO 桥接 + 定制上线
  • SLA + 优先路线图

统一定价、不限站点——不按文件/调用计费。年付约省2个月;提供终身选项。14天退款。结账时处理买方增值税。

常见问题

常见问题解答

FluxFiles 是免费且开源的吗?
是的——采用 MIT 许可,可免费自托管,发布在 Composer 和 npm 上。没有付费档位,也没有使用限制。
我的文件存在哪里?
由你指定:本地磁盘、AWS S3、Cloudflare R2,或通过 SFTP 连接远程服务器——均通过 Flysystem。存储归你所有——不经过任何第三方。
身份验证如何工作?
无状态 JWT(HS256):你在服务端签发带有细粒度声明(权限、磁盘、路径范围、限额)的令牌,因此每个用户只能看到你允许的内容。
我的用户需要 FluxFiles 账号吗?
不需要。FluxFiles 信任你自己应用签发的 JWT,可直接接入你现有的认证——无需单独的用户系统。
能嵌入到我现有的应用或编辑器里吗?
可以——iframe + JS SDK 适用于任意页面,并提供 Laravel、WordPress、React、Vue/Nuxt、CKEditor 4、TinyMCE 和 Summernote 的官方适配器。
运行它需要什么?
PHP 8.1+、几个常见扩展和 Composer。指向一个磁盘,设置密钥与允许来源,然后启动即可——在小型 VPS 上也能流畅运行。
付费套餐包含什么?
核心免费(MIT)。付费套餐解锁文件门户模块:品牌分享(有效期/密码链接)和上传门户(公开“把文件发给我”),更高套餐还含版本管理、Webhooks、AI 视觉/OCR 及合规套件。
如何激活许可证?
购买后你会获得一个许可证密钥。在环境中设置 FLUXFILES_LICENSE_KEY,付费模块即解锁——离线验证(不回连),可在隔离网络中使用。
一次性还是订阅?
两者皆可。按月低门槛起步,按年更省(约2个月免费),或一次性终身。许可证到期后仍可运行现有版本;仅暂停更新/支持。

准备好嵌入 FluxFiles 了吗?

几分钟内为你的应用添加生产级文件管理器——不锁定框架,采用 MIT 许可。