一個允許匿名上傳文件,通過一次性鏈接進行分享,並強制下載方登錄實現可審計的文件分發平台。
- ✅ 匿名文件上傳(最大100MB)
- ✅ 一次性分享鏈接
- ✅ 強制登錄下載
- ✅ 完整的下載審計記錄
- ✅ MinIO/R2對象存儲整合
- ✅ 現代化的響應式UI
- ✅ API速率限制(防止滥用)
- ✅ 文件类型验证(安全防护)
- ✅ 数据库索引优化(性能提升)
- 前端: Next.js 16, React 19, TypeScript, Tailwind CSS
- 後端: Next.js API Routes
- 數據庫: SQLite + Prisma ORM
- 認證: NextAuth.js
- 存儲: MinIO (兼容S3)
- 部署: Vercel/Netlify
- Node.js 18+
- npm 或 yarn
-
克隆項目
git clone <repository-url> cd jump-files
-
安裝依賴
npm install
-
設置環境變數
創建
.env.local文件:# 數據庫 DATABASE_URL="file:./dev.db" # NextAuth.js NEXTAUTH_URL="http://localhost:3000" NEXTAUTH_SECRET="your-secret-key-here-change-in-production" # MinIO 對象存儲 MINIO_ENDPOINT="localhost:9000" MINIO_ACCESS_KEY="minioadmin" MINIO_SECRET_KEY="minioadmin" MINIO_BUCKET_NAME="jump-files" # 應用配置 MAX_FILE_SIZE_MB=100
-
設置 MinIO
下載並啟動 MinIO:
# 使用 Docker docker run -p 9000:9000 -p 9001:9001 \ -e MINIO_ROOT_USER=minioadmin \ -e MINIO_ROOT_PASSWORD=minioadmin \ minio/minio server /data --console-address ":9001"
或使用二進制文件安裝 MinIO。
-
初始化數據庫
# 生成 Prisma 客戶端 npx prisma generate # 運行遷移 npx prisma migrate dev --name init # 可選:打開 Prisma Studio 查看數據庫 npx prisma studio
-
啟動開發服務器
npm run dev
應用程序將在
http://localhost:3000上運行。
- 訪問首頁
- 選擇要上傳的文件(最大100MB)
- 點擊"上傳文件"
- 獲取分享鏈接和管理鏈接
- 點擊分享鏈接
- 如果未登錄,系統會要求登錄
- 確認下載信息後點擊"下載文件"
- 文件將自動開始下載
- 使用管理鏈接訪問審計頁面
- 查看文件的下載記錄
- 包含下載用戶和時間信息
src/
├── app/ # Next.js App Router
│ ├── api/ # API 路由
│ ├── auth/ # 認證頁面
│ ├── audit/ # 審計頁面
│ ├── download/ # 下載頁面
│ └── page.tsx # 首頁
├── components/ # React 組件
├── config/ # 配置檔案
├── lib/ # 工具函數
│ ├── auth.ts # NextAuth 配置
│ ├── prisma.ts # 數據庫客戶端
│ ├── storage.ts # MinIO 存儲
│ └── token.ts # Token 工具
└── middleware.ts # Next.js 中間件
POST /api/upload
Content-Type: multipart/form-data
Response:
{
"shareUrl": "http://localhost:3000/download/...",
"adminUrl": "http://localhost:3000/audit/...",
"token": "...",
"adminToken": "...",
"fileId": "..."
}
GET /api/download/validate/{token}
Response:
{
"token": { ... },
"file": { ... }
}
POST /api/download/{token}
Request Body:
{
"userId": "..."
}
Response: 文件下載 URL
GET /api/audit/{adminToken}
Response:
{
"file": { ... },
"downloads": [ ... ]
}
- id: 唯一標識符
- email: 郵箱地址
- name: 姓名
- password: 加密密碼
- createdAt/updatedAt: 時間戳
- id: 唯一標識符
- objectKey: MinIO 對象鍵
- size: 文件大小
- adminToken: 管理token
- createdAt: 上傳時間
- id: 唯一標識符
- token: 一次性token
- status: "unused" | "used"
- fileId: 關聯文件
- usedBy: 下載用戶ID
- usedAt: 下載時間
- 文件不落地服務器,直接存儲到對象存儲(MinIO/R2)
- 一次性token確保鏈接只能使用一次
- 強制登錄確保下載行為可審計
- 高熵token防止暴力破解
- 數據庫事務確保數據一致性
- API速率限制:防止DDoS攻擊和API濫用
- 文件類型驗證:多層驗證機制(擴展名、MIME類型、文件內容簽名)
- 危險文件過濾:自動拒絕可執行文件等危險類型
- 數據庫索引優化:提升查詢性能,減少數據庫負載
-
設置生產環境變數
DATABASE_URL="postgresql://..." NEXTAUTH_URL="https://yourdomain.com" NEXTAUTH_SECRET="強密碼"
-
設置 MinIO 或 S3
MINIO_ENDPOINT="your-s3-endpoint" MINIO_ACCESS_KEY="your-access-key" MINIO_SECRET_KEY="your-secret-key" MINIO_BUCKET_NAME="your-bucket"
-
構建和部署
npm run build npm start
- 基礎架構設置
- 用戶認證系統
- 文件上傳功能
- 一次性鏈接分享
- 強制登錄下載
- 下載審計功能
- MinIO/R2 存儲整合
- API 速率限制 ✅
- 文件類型驗證 ✅
- 數據庫索引優化 ✅
- 文件預覽功能
- 批量上傳
- 管理員面板
- 文件過期清理
- 監控和日誌系統
- 測試覆蓋
歡迎提交 Issue 和 Pull Request!
MIT License