2026-08-31 17:41:56 +08:00
2026-08-31 17:41:56 +08:00
2026-08-31 17:41:56 +08:00
2026-08-31 17:41:56 +08:00

tmp-upload

一个自托管的临时文件分享服务。上传文件后获得一个下载链接,24 小时后自动删除

  • Single binary,no runtime dependencies
  • Built-in web UI (zero external assets)
  • 10 GB default quota (configurable)
  • Daily audit log (optional)

快速开始

go build -o server .
./server
# → 浏览器打开 http://localhost:8080
# 命令行上传
curl -F "file=@report.pdf" http://localhost:8080/upload
# → {"filename":"report.pdf","url":"/download/report-2026-08-27-abc123.pdf","expires_at":"..."}

配置(命令行 flag)

-dir                       ./data/uploads                              上传文件保存目录
-listen                    :8080                                       HTTP 监听地址
-ttl                       24h                                         文件过期 TTL
-scan                      1h                                          清理扫描间隔
-quota                     10737418240                                 总目录配额(字节,默认 10 GB;0 = 不限)
-audit-dir                 ./data/audit                                审计日志目录(每天一个 YYYY-MM-DD.log 文件;空字符串禁用)
-file-viewer-cdn           https://unpkg.com/@file-viewer/web-full@3.0.0  文件预览库 CDN 地址
-file-viewer-cache         ./data/file-viewer                          文件预览库资源缓存目录(空字符串 = 禁用,全部 CDN 透传)
-file-viewer-ttl           0                                           缓存文件有效期(0 = 永久)

示例:把 TTL 改成 1 小时、配额 1 GB:

./server -ttl 1h -quota 1073741824

HTTP API

Method Path 说明
GET / Web UI(单 HTML 响应,CSS/JS 经 /static 引用)
POST /upload 上传文件(multipart/form-data,字段名 file)
GET /files 列出当前未过期文件
GET /download/:filename 下载文件
POST /download-zip 批量下载 (body: {"files":[...]}, 最多 100 项)
POST /files-delete 批量删除 (body: {"files":[...]}, 最多 100 项)
DELETE /files/:filename 删除文件
GET /file-viewer/*filepath 文件预览库资源(CDN 缓存代理)

目录结构

tmp-upload/
├── main.go                  # 入口、配置、路由注册 (72 行)
├── embed.go                 # //go:embed + fs.Sub 静态资源 (26 行)
├── audit.go                 # 审计日志子系统 (102 行)
├── quota.go                 # 配额管理 + formatSize (112 行)
├── handlers.go              # HTTP handlers + DTOs (308 行)
├── batch.go                 # 批量下载 / 批量删除 handlers (248 行)
├── cleaner.go               # TTL 过期清理 (57 行)
├── audit_test.go            # audit 单元测试
├── security_test.sh         # HTTP 端到端测试
├── go.mod / go.sum
└── static/
    ├── index.html.tpl       # HTML 骨架 (经 /static 引用 CSS/JS, 含批量删除按钮)
    ├── app.css              # CSS (359 行)
    ├── app.js               # JS — 主程序 (443 行)
    ├── helpers.js           # JS — 纯函数 + 倒计时 (58 行)
    └── batch.js             # JS — 批量选择 / 批量下载 / 批量删除 (119 行)

单文件部署说明

embed.go//go:embedstatic/ 下的 CSS/JS 编入二进制, 在 init() 中用 fs.Sub 切出 static/ 子文件系统供 /static 路由对外提供; HTML 骨架 index.html.tpl 单独 embed,GET / 直接返回。 浏览器加载的是拆分请求(HTML + <link> CSS + <script> JS), 但所有资源仍编译进单个二进制,部署依旧单文件,无需运行时外部文件。


测试

go test ./...                    # 单元测试(audit 日志格式)
bash security_test.sh            # 端到端安全 / 接口测试
go vet ./...                     # 静态检查

安全相关

  • DELETE /files/:filename 不要求鉴权 — 部署时建议放在反代之后或加防火墙
  • 文件名采用时间戳 + 随机串避免冲突与枚举
  • 没有请求体大小硬限制(超出 -quota 时上传会失败)

License

Personal project. Use at your own risk.

S
Description
No description provided
Readme
168 KiB
Languages
Go 37.4%
JavaScript 24.7%
Shell 23.2%
CSS 11.2%
Go Template 3.5%