可嵌入任何地方的文件管理器
PHP ≥ 8.1 + Flysystem 3。Alpine.js 界面。Local、S3、Cloudflare R2、SFTP。几行 JavaScript 即可嵌入。
查看实际效果
客户的文件留在客户自己的存储桶里
FluxFiles 是可嵌入的文件管理器:每个租户接入自己的 S3/R2 存储桶——你永远不存储他们的数据或凭证。
-
数据主权
文件存放在客户自己的云账户与区域——契合 GDPR、合规与企业采购。
-
静态不留数据、不留凭证
存储桶凭证以 AES-256-GCM 加密在 JWT 中,仅在运行时解密——绝不写入数据库或日志。
-
存储成本可归零
存储与出口流量由各客户承担,而非你。账单不会随用户增长而膨胀。
-
无状态且可嵌入
无中心数据库。通过 iframe 或 SDK 把选择器嵌入任意应用;由你的后端签发受限的短时令牌。
工作原理:你的应用把租户的存储桶凭证加密进一个短时 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,
}); 搭配 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= 兼容
集成
适配你技术栈的即插即用适配器
官方适配器可将 FluxFiles 原生嵌入你已经在用的框架和编辑器中。
嵌入
几行代码即可嵌入
加载 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 | elFinder | Laravel-FM | RichFilemanager | Responsive FM |
|---|---|---|---|---|---|
| S3 + R2 + Local + SFTP | ✓ | ⚠ | ⚠ | ⚠ | ✗ |
| 嵌入任何框架 | ✓ | ⚠ | ✗ | ⚠ | ✗ |
| JWT认证 + 权限范围 | ✓ | ✗ | ✗ | ✗ | ✗ |
| SEO元数据 | ✓ | ✗ | ✗ | ✗ | ✗ |
| AI自动标签 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 图片裁剪 | ✓ | ✓ | ✗ | ✗ | ✗ |
| 分片上传 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 全文搜索 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 深色模式 | ✓ | ✗ | ⚠ | ✗ | ✗ |
| 16种语言 | ✓ | ✓ | ✗ | ✗ | ✗ |
| PHP ≥ 8.1 | ✓ | ✓ | ✗ | ✓ | ✓ |
| 积极维护中 | ✓ | ✓ | ⚠ | ✗ | ✗ |
| 现代UI | ✓ | ✗ | ⚠ | ✗ | ✗ |
自托管且可嵌入——而非又一个上传 SaaS
托管文件 API 很好,但它们存储你的数据并按用量计费。FluxFiles 运行在你的技术栈中,每个租户使用自己的存储桶。
| 能力 | FluxFiles | Filestack | Uploadcare | Cloudinary | Supabase Storage |
|---|---|---|---|---|---|
| 自托管(运行在你的基础设施) | ✓ | ✗ | ✗ | ✗ | ⚠ |
| BYOB——每个客户自有存储桶 | ✓ | ⚠ | ⚠ | ✗ | ✗ |
| 可嵌入的文件管理器 UI | ✓ | ✓ | ✓ | ⚠ | ✗ |
| 开源(MIT) | ✓ | ✗ | ✗ | ✗ | ✓ |
| 无按存储/上传的 SaaS 费用 | ✓ | ✗ | ✗ | ✗ | ⚠ |
| 多存储(S3 / R2 / 本地) | ✓ | ⚠ | ✗ | ✗ | ✗ |
| 内置按租户令牌作用域 | ✓ | ⚠ | ⚠ | ⚠ | ⚠ |
对比反映各产品的典型默认能力;每款产品在各自领域都很出色。FluxFiles 的定位是可嵌入、自托管、自带存储桶三者的组合。
可售产品
不止管理文件——还能收发文件
免费核心嵌入文件管理器。付费模块把它变成客户愿意付费的产品。
Branded Share
向任意文件或文件夹发送带品牌的自助链接——含有效期、密码、下载上限和查看分析。你的 logo,你的域名。
- 有效期/密码保护链接
- 下载上限 + 查看分析
- 范围令牌——收件人无需账号
Upload Portals
公开的“把文件发给我们”页面,直接落入你的存储。适合代理、摄影师和客户入驻——上传者无需账号。
- 公开门户 → 你的存储桶
- 每门户大小/类型/有效期限制
- 匿名上传,按所有者范围控制
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 核心永久免费。升级即可获得两大产品——品牌分享 + 上传门户——以及更多。
免费(核心)
完整的 MIT 文件管理器,自托管。
开始使用- Local / S3 / R2 / SFTP 存储,JWT 范围控制
- 按需 WebP + AVIF + 图片/PDF 优化
- 水印、版本钩子、用量面板、AI 自动标签
- 7 个适配器 + BYO-embed 终端 / PDF / office / 电子签
Pro
与客户收发文件。
即将推出即将推出- 包含免费版全部
- 品牌分享——带有效期/密码/上限/分析的链接
- 上传门户——公开“把文件发给我”,无需账号
- 优先支持 + 更新
Studio
在 FluxFiles 上打造产品。
即将推出即将推出- 包含 Pro 全部
- 版本管理 + Webhooks(Zapier/Make/n8n)
- AI 视觉 + OCR(自带密钥)
- 多租户权限分层 + 白标
统一定价、不限站点——不按文件/调用计费。年付约省2个月;提供终身选项。14天退款。结账时处理买方增值税。
常见问题