어디에든 임베드할 수 있는 파일 매니저
PHP ≥ 8.1 + Flysystem 3. Alpine.js UI. Local, S3, Cloudflare R2. 몇 줄의 JavaScript로 임베드.
실제 동작 확인
현대적인 파일 매니저에 필요한 모든 것
유연성이 필요한 개발자를 위해 구축.
멀티 스토리지
로컬, AWS S3, Cloudflare R2 — Flysystem v3. 설정만으로 전환.
어디든 임베드
iframe + postMessage SDK. 독립 UI는 Alpine.js(빌드 없음). 모든 프레임워크와 호환.
JWT 인증 + 스코핑
사용자별 경로 접두사, 권한, 디스크 화이트리스트, owner-only 모드.
AI 자동 태그
Claude / OpenAI vision — alt 텍스트, 제목, 태그 자동 생성.
이미지 자르기
종횡비 프리셋이 있는 인라인 자르기 도구.
이미지 최적화
WebP 변형 자동 생성 — 썸네일, 중간, 대형.
사전 서명 업로드
브라우저에서 S3/R2로 직접 업로드 — 서버 대역폭 제로.
청크 업로드
10MB 초과 파일용 S3 멀티파트.
전체 텍스트 검색
SQLite FTS5로 이름, 제목, 태그 검색.
일괄 작업
다중 선택 이동, 복사, 삭제, 다운로드.
크로스 디스크 전송
로컬 ↔ S3 ↔ R2 간 복사/이동.
휴지통
복구 가능한 삭제, 자동 정리.
SEO 메타데이터
제목, alt, 캡션, 태그 — 클라우드는 S3 객체 메타데이터, 로컬은 sidecar JSON. 전체 텍스트 검색.
다크 모드
UI 및 SDK에서 라이트/다크/자동.
16개 언어
기본 영어. SDK, URL (?locale=), FLUXFILES_LOCALE로 설정. 아랍어 RTL.
감사 로그
모든 쓰기 작업 기록.
속도 제한
사용자별 토큰 버킷 API 보호.
저장소 할당량
JWT 클레임을 통한 사용자별 제한.
BYOB 버킷
사용자 자체 S3/R2 — JWT 내 자격 증명 암호화(AES-256-GCM).
중복 감지
SHA-256 일치 시 강제 덮어쓰기 전까지 중복 업로드 건너뜀.
SDK 토큰 갱신
401 시 onTokenRefresh — 갱신 병합, 재시도, updateToken()으로 사전 갱신.
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 <!-- Demo: unpkg. In production, serve fluxfiles.js from your FluxFiles host -->
<script src="https://unpkg.com/fluxfiles@1.22.0/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
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 | elFinder | Laravel-FM | RichFilemanager | Responsive FM |
|---|---|---|---|---|---|
| S3 + R2 + Local | ✓ | ⚠ | ⚠ | ⚠ | ✗ |
| 모든 프레임워크에 임베드 | ✓ | ⚠ | ✗ | ⚠ | ✗ |
| JWT 인증 + 스코핑 | ✓ | ✗ | ✗ | ✗ | ✗ |
| SEO 메타데이터 | ✓ | ✗ | ✗ | ✗ | ✗ |
| AI 자동 태그 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 이미지 자르기 | ✓ | ✓ | ✗ | ✗ | ✗ |
| 청크 업로드 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 전체 텍스트 검색 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 다크 모드 | ✓ | ✗ | ⚠ | ✗ | ✗ |
| 16개 언어 | ✓ | ✓ | ✗ | ✗ | ✗ |
| PHP ≥ 8.1 | ✓ | ✓ | ✗ | ✓ | ✓ |
| 활발히 유지보수 중 | ✓ | ✓ | ⚠ | ✗ | ✗ |
| 현대적 UI | ✓ | ✗ | ⚠ | ✗ | ✗ |