v0.2 — Mã nguồn mở · Giấy phép MIT

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.

PHP ≥ 8.1
Không cần framework
~3 KB
Kích thước SDK
MIT
Giấy phép mã nguồn mở
16
Ngôn ngữ hỗ trợ
Xem trước

Xem thực tế

Creating a FluxFiles share link with an expiry, a password and a download limit
Chia sẻ file — hạn dùng, mật khẩu, giới hạn tải
Creating a FluxFiles upload portal with a file limit, size cap and allowed file types
Cổng nhận tệp — khách gửi file, không cần tài khoản
FluxFiles links panel listing shared links with views, downloads and revoke
Quản lý mọi liên kết, thu hồi bất kỳ lúc nào
FluxFiles desktop file manager with image thumbnails
Lưới ảnh với thumbnail WebP tức thì
FluxFiles browsing an S3 / R2 bucket with the local, S3 and SFTP disk switcher
Đa đám mây — S3 / R2 / SFTP, một giao diện
FluxFiles managing a remote VPS deploy directory over SFTP, same UI as the S3 bucket
VPS từ xa qua SFTP — không cần FTP client
Editing an nginx config file inside FluxFiles with syntax highlighting
Sửa file cấu hình ngay tại chỗ — không cần SSH hay FTP
FluxFiles previewing a video inline in the detail panel
Xem trước video, audio và PDF mà không cần tải về
FluxFiles Bucket Doctor health checks for an S3 bucket with CORS and IAM remediation
Bucket Doctor — kiểm tra S3/R2 + cách khắc phục
FluxFiles activity log of file operations
Nhật ký hoạt động — lưu trong bucket của bạn
FluxFiles trash with restore and delete forever
Thùng rác — khôi phục hoặc xoá vĩnh viễn
FluxFiles responsive mobile file manager
Tương thích trên di động
Lợi thế · BYOB

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.

App SaaS của bạn
JWT giới hạn (creds mã hóa)
FluxFiles
chỉ giải mã lúc runtime
Tenant A
bucket riêng
Tenant B
bucket riêng
Tenant C
bucket riêng

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.

Đa người thuê

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,
});
prefix disks / BYOB max_upload max_storage max_files allowed_ext perms

Kết hợp BYOB để mỗi tenant dùng bucket riêng của họ.

Dành cho ai

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.

Tính năng

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).

Cài đặt nhanh

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

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

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.

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

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.

Tại sao FluxFiles

Xây dựng cho những gì người khác bỏ quên

Vuốt để so sánh
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
so với file-API SaaS

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.

Vuốt để so sánh
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.

Pro

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
Pro

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ủ
Enterprise

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)

$0 vĩnh viễn

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
Phổ biến nhất

Pro

$79 /năm

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

$299 /năm

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

Liên hệ

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?
Có — giấy phép MIT, tự host miễn phí, phát hành trên Composer và npm. Không có gói trả phí, không giới hạn sử dụng.
File của tôi lưu ở đâu?
Ở nơi bạn trỏ tới: ổ local, AWS S3, Cloudflare R2 hoặc server từ xa qua SFTP — tất cả qua Flysystem. Bạn sở hữu nơi lưu trữ — không gì đi qua bên thứ ba.
Xác thực hoạt động thế nào?
JWT phi trạng thái (HS256): bạn cấp token ở server với các claim chi tiết (quyền, disk, phạm vi đường dẫn, giới hạn), nên mỗi user chỉ thấy đúng phần bạn cho phép.
Người dùng có cần tài khoản FluxFiles không?
Không. FluxFiles tin tưởng JWT do chính ứng dụng của bạn cấp, nên gắn thẳng vào hệ thống auth sẵn có — không cần hệ thống user riêng.
Tôi có nhúng được vào app/editor sẵn có không?
Có — iframe + JS SDK chạy trên mọi trang, kèm adapter chính thức cho Laravel, WordPress, React, Vue/Nuxt, CKEditor 4, TinyMCE và Summernote.
Cần gì để chạy?
PHP 8.1+ với vài extension phổ biến và Composer. Trỏ tới một disk, đặt secret và allowed origins, rồi chạy — nhẹ tới mức chạy được trên VPS nhỏ.
Các gói trả phí gồm những gì?
Lõi miễn phí (MIT). Gói trả phí mở module cổng file: Branded Share (link hết hạn/mật khẩu) và Upload Portals (cổng “gửi file cho tôi” công khai), cộng Versioning, Webhooks, AI Vision/OCR và bộ tuân thủ ở gói cao hơn.
Kích hoạt license thế nào?
Sau khi mua bạn nhận một license key. Đặt FLUXFILES_LICENSE_KEY trong môi trường là module trả phí mở — xác thực offline (không phone-home), chạy được cả air-gapped.
Trả một lần hay thuê bao?
Cả hai. Theo tháng để khởi đầu nhẹ, theo năm để tiết kiệm (≈ 2 tháng), hoặc trọn đời một lần. License hết hạn vẫn chạy bản đang có; chỉ tạm dừng update/support.

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.