Trình quản lý file nhúng được mọi nơi
PHP ≥ 8.1 + Flysystem 3. Giao diện Alpine.js. Local, S3, Cloudflare R2, SFTP. Nhúng chỉ với vài dòng JavaScript.
Xem thực tế
File của khách hàng nằm trong bucket của chính họ
FluxFiles là file manager nhúng được, nơi mỗi tenant kết nối bucket S3/R2 của riêng họ — và bạn không bao giờ lưu data hay credentials của họ.
-
Chủ quyền dữ liệu
File nằm trong tài khoản và region cloud của khách — phù hợp GDPR, compliance, mua sắm doanh nghiệp.
-
Không lưu data, không lưu creds
Credentials bucket được mã hóa AES-256-GCM trong JWT và chỉ giải mã lúc runtime — không bao giờ ghi vào database hay log.
-
Chi phí lưu trữ về 0
Storage và egress tính vào từng khách, không phải bạn. Không có hóa đơn storage phình theo lượng người dùng.
-
Stateless & nhúng được
Không database trung tâm. Nhúng picker vào app bất kỳ qua iframe hoặc SDK; backend của bạn phát token giới hạn, ngắn hạn.
Cách hoạt động: app của bạn mã hóa credentials bucket của tenant vào một JWT ngắn hạn (HKDF-SHA256 + AES-256-GCM). FluxFiles chỉ giải mã để chạy thao tác được yêu cầu.
Mỗi tenant một token — với luật riêng
FluxFiles không trạng thái: JWT do backend của bạn ký chính là config của tenant. Đường dẫn lưu, giới hạn dung lượng file, quota, số file, loại file cho phép, quyền — tất cả enforce ở server. Không file config riêng, không cần restart.
// 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,
}); Kết hợp BYOB để mỗi tenant dùng bucket riêng của họ.
Tạo ra cho đội ngũ làm tính năng quản lý file
Nếu sản phẩm của bạn cần upload, FluxFiles gắn vào ngay — mà không biến bạn thành nơi giữ dữ liệu của khách hàng.
SaaS & ứng dụng đa người thuê
Cho mỗi khách hàng một trình quản lý file trên bucket riêng của họ. Giới hạn token theo tenant và chủ quyền dữ liệu có sẵn.
Agency & freelancer
Giao thư viện media gọn gàng cho từng khách mà không phải dựng hạ tầng lưu trữ cho mỗi dự án.
Tích hợp CMS & trình soạn thảo
Gắn bộ chọn media vào CKEditor, TinyMCE, Summernote hoặc editor của bạn qua iframe SDK.
Công cụ nội bộ & dashboard
Thêm upload, xem trước và thao tác file có audit vào trang quản trị chỉ trong một buổi chiều.
Mọi thứ một trình quản lý file hiện đại cần
Xây dựng cho lập trình viên cần sự linh hoạt.
Đa lưu trữ
Local, AWS S3, Cloudflare R2, SFTP qua Flysystem v3 — đổi bằng config, không sửa code.
Nhúng mọi nơi
iframe + SDK postMessage. UI độc lập dùng Alpine.js (không build). Dùng được với mọi framework.
JWT auth + phân quyền
Prefix đường dẫn theo user, quyền, whitelist disk, chế độ owner-only.
AI auto-tag
Claude / OpenAI vision — tự động alt text, tiêu đề, tags.
Cắt ảnh
Công cụ cắt ảnh với tỷ lệ khung hình sẵn.
Tối ưu ảnh
Tự tạo biến thể WebP — thumb, medium, large.
Upload presigned
Trình duyệt upload trực tiếp lên S3/R2 — không tốn bandwidth server.
Upload phân mảnh
S3 multipart cho file > 10MB.
Tìm kiếm toàn văn
Tìm kiếm có index theo tên, tiêu đề, tags — dựa trên file, không cần database.
Thao tác hàng loạt
Chọn nhiều file để di chuyển, sao chép, xóa, tải.
Chuyển giữa các disk
Sao chép/di chuyển giữa Local ↔ S3 ↔ R2.
Thùng rác
Xóa mềm có thể khôi phục, tự dọn dẹp.
SEO metadata
Title, alt, caption, tags — metadata object S3 (cloud) hoặc sidecar JSON (local). Tìm kiếm full-text.
Chế độ tối
Sáng / tối / tự động trong UI và SDK.
16 ngôn ngữ
Mặc định tiếng Anh. Đặt locale qua SDK, URL (?locale=), hoặc FLUXFILES_LOCALE. RTL cho tiếng Ả Rập.
Nhật ký kiểm toán
Ghi log tất cả hành động ghi.
Giới hạn tốc độ
Token bucket cho mỗi người dùng.
Hạn mức lưu trữ
Giới hạn dung lượng theo JWT claims.
BYOB bucket
Người dùng gắn S3/R2 riêng — credential mã hóa trong JWT (AES-256-GCM).
Phát hiện trùng file
Khớp SHA-256 bỏ qua upload trùng trừ khi bạn force ghi đè.
Làm mới token SDK
onTokenRefresh khi 401 — gộp refresh, thử lại, và updateToken() để đổi token chủ động.
Bucket Doctor
Chẩn đoán disk S3/R2 bất kỳ — credentials, đọc/ghi/xóa, presign, CORS, multipart — kèm bản vá IAM & CORS dán là chạy. Onboard bucket BYOB trong vài phút.
Node token SDK
Phát token FluxFiles từ backend JS bất kỳ (Express, Next.js, Nuxt) với @fluxfiles/node — tương thích byte với core PHP. Không cần PHP để phát token.
Ổ đĩa SFTP
Driver thứ 3 sau S3/R2 — biến mọi VPS hay shared host thành trình quản lý tệp.
Sửa code / config
Sửa tệp văn bản và cấu hình (wp-config.php, .env, nginx.conf) ngay trên trình duyệt.
Nén & Giải nén
Tải lựa chọn dưới dạng zip, hoặc giải nén tại chỗ — chống zip-slip & zip-bomb.
Đóng dấu watermark
Thêm watermark chữ hoặc logo theo thời gian thực để bảo vệ — không đụng tệp gốc.
WebP + AVIF theo yêu cầu
Phục vụ mọi kích thước ảnh dạng AVIF/WebP cache qua 1 URL (theo Accept), kèm srcset responsive.
Phân quyền SFTP
Đổi quyền tệp Unix (chmod) trên ổ SFTP bằng hộp thoại kiểu cPanel.
Bảng dung lượng
Xem dung lượng tức thì — quota cùng phân tích theo loại và theo thư mục.
Xem trước media
Xem trực tiếp ảnh, video, audio & PDF; media local riêng tư stream an toàn (hỗ trợ Range).
Chạy trong 2 phút
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= Tương thích với
Tích hợp
Adapter cắm-là-chạy cho stack của bạn
Các adapter chính thức nhúng FluxFiles trực tiếp vào framework và trình soạn thảo bạn đang dùng.
Nhúng
Nhúng chỉ với vài dòng
Tải fluxfiles.js, truyền JWT do server cấp, và đặt nguyên một trình quản lý file — hoặc một modal chọn file — vào bất kỳ trang nào.
<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)}
/>
);
} Token được cấp ở phía server — đừng bao giờ đưa secret ra trình duyệt.
Xây dựng cho những gì người khác bỏ quên
| Tính năng | FluxFiles | elFinder | Laravel-FM | RichFilemanager | Responsive FM |
|---|---|---|---|---|---|
| S3 + R2 + Local + SFTP | ✓ | ⚠ | ⚠ | ⚠ | ✗ |
| Nhúng mọi framework | ✓ | ⚠ | ✗ | ⚠ | ✗ |
| JWT auth + phân quyền | ✓ | ✗ | ✗ | ✗ | ✗ |
| SEO metadata | ✓ | ✗ | ✗ | ✗ | ✗ |
| AI auto-tag | ✓ | ✗ | ✗ | ✗ | ✗ |
| Cắt ảnh | ✓ | ✓ | ✗ | ✗ | ✗ |
| Upload phân mảnh | ✓ | ✗ | ✗ | ✗ | ✗ |
| Tìm kiếm toàn văn | ✓ | ✗ | ✗ | ✗ | ✗ |
| Chế độ tối | ✓ | ✗ | ⚠ | ✗ | ✗ |
| 16 ngôn ngữ | ✓ | ✓ | ✗ | ✗ | ✗ |
| PHP ≥ 8.1 | ✓ | ✓ | ✗ | ✓ | ✓ |
| Đang maintain | ✓ | ✓ | ⚠ | ✗ | ✗ |
| UI hiện đại | ✓ | ✗ | ⚠ | ✗ | ✗ |
Self-hosted và nhúng được — không phải một upload SaaS nữa
Các file API hosted rất tốt, nhưng chúng lưu data của bạn và tính phí theo dùng. FluxFiles chạy trong hạ tầng của bạn, mỗi tenant trên bucket riêng.
| Khả năng | FluxFiles | Filestack | Uploadcare | Cloudinary | Supabase Storage |
|---|---|---|---|---|---|
| Self-hosted (chạy trong hạ tầng của bạn) | ✓ | ✗ | ✗ | ✗ | ⚠ |
| BYOB — bucket riêng của từng khách | ✓ | ⚠ | ⚠ | ✗ | ✗ |
| UI file manager nhúng được | ✓ | ✓ | ✓ | ⚠ | ✗ |
| Mã nguồn mở (MIT) | ✓ | ✗ | ✗ | ✗ | ✓ |
| Không phí SaaS theo storage / upload | ✓ | ✗ | ✗ | ✗ | ⚠ |
| Đa storage (S3 / R2 / local) | ✓ | ⚠ | ✗ | ✗ | ✗ |
| Scope token theo từng tenant sẵn có | ✓ | ⚠ | ⚠ | ⚠ | ⚠ |
So sánh phản ánh gói mặc định thông thường; mỗi sản phẩm mạnh ở mảng riêng. Niche của FluxFiles là bộ ba nhúng-được, self-hosted, bring-your-own-bucket.
Sản phẩm bán được
Không chỉ quản lý — còn bán & nhận file
Lõi miễn phí nhúng trình quản lý file. Module trả phí biến nó thành sản phẩm khách hàng bạn sẵn sàng trả tiền.
Branded Share
Gửi link tự phục vụ có thương hiệu tới bất kỳ file/thư mục — có hết hạn, mật khẩu, giới hạn tải, và analytics. Logo của bạn, domain của bạn.
- Link hết hạn / có mật khẩu
- Giới hạn lượt tải + analytics
- Token giới hạn — người nhận không cần tài khoản
Upload Portals
Trang “gửi file cho tôi” công khai, đổ thẳng vào storage của bạn. Lý tưởng cho agency, nhiếp ảnh, onboarding khách — người tải không cần tài khoản.
- Cổng công khai → bucket của bạn
- Giới hạn dung lượng / loại / hạn theo từng cổng
- Tải ẩn danh, giới hạn theo chủ
Bộ tuân thủ
Quét virus, C2PA provenance và lưu audit — cho triển khai enterprise/quản lý chặt.
WordPress
Một plugin thay vì ba
Trên WordPress, FluxFiles vừa là cổng file khách hàng vừa là trình quản lý media — thay cả plugin folder, cloud và offload riêng lẻ.
| Tính năng | FluxFiles | FileBird | WP Media Folder | WP Offload |
|---|---|---|---|---|
| Thư mục media | — | |||
| Lưu S3 / R2 / SFTP | — | |||
| Offload + rewrite URL | — | — | ||
| Cổng khách tải file | — | — | — | |
| Link chia sẻ có thương hiệu | — | — | — | |
| Giá phổ biến | Một license | $49/năm | $69/năm | trả phí |
Folder + cloud + offload + cổng khách trong một — thay vì trả riêng FileBird và WP Media Folder và WP Offload.
Bảng giá
Lõi miễn phí. Chỉ trả cho các module trả phí.
Lõi MIT miễn phí vĩnh viễn. Nâng cấp cho 2 sản phẩm hero — Branded Share + Upload Portals — và hơn thế.
Miễn phí (Lõi)
File manager MIT đầy đủ, tự host.
Bắt đầu- Lưu trữ Local / S3 / R2 / SFTP, JWT-scoped
- WebP + AVIF theo yêu cầu + tối ưu ảnh/PDF
- Đóng dấu, versioning-hook, dashboard dung lượng, AI auto-tag
- 7 adapter + BYO-embed terminal / PDF / office / e-sign
Pro
Gửi & nhận file với khách.
Sắp ra mắtSắp ra mắt- Mọi thứ trong Free
- Branded Share — link hết hạn / mật khẩu / giới hạn / analytics
- Upload Portals — cổng công khai “gửi file cho tôi”, không cần tài khoản
- Hỗ trợ ưu tiên + cập nhật
Studio
Xây sản phẩm trên FluxFiles.
Sắp ra mắtSắp ra mắt- Mọi thứ trong Pro
- Versioning + Webhooks (Zapier/Make/n8n)
- AI Vision + OCR (BYO-key)
- Multi-tenant claim-tiering + white-label
Enterprise
Tuân thủ, quy mô lớn.
Liên hệ- Mọi thứ trong Studio
- Quét virus + C2PA provenance + lưu audit
- Cầu SSO + onboarding riêng
- SLA + roadmap ưu tiên
Giá cố định, không giới hạn site — không tính theo file/lượt. Gói năm tiết kiệm ~2 tháng; có tùy chọn trọn đời (lifetime). Hoàn tiền 14 ngày. VAT xử lý khi thanh toán.
Hỏi đáp
Câu hỏi thường gặp
FluxFiles có miễn phí và mã nguồn mở không?
File của tôi lưu ở đâu?
Xác thực hoạt động thế nào?
Người dùng có cần tài khoản FluxFiles không?
Tôi có nhúng được vào app/editor sẵn có không?
Cần gì để chạy?
Các gói trả phí gồm những gì?
Kích hoạt license thế nào?
Trả một lần hay thuê bao?
Sẵn sàng nhúng FluxFiles?
Thêm trình quản lý file sẵn sàng cho production vào ứng dụng của bạn chỉ trong vài phút — không khóa framework, giấy phép MIT.