这是一个集成了 TinyPNG 图片压缩服务、七牛云存储和 Cloudflare R2 存储的 Web 应用。该应用提供了一个便捷的图片压缩和云存储解决方案。
后端按“HTTP → 用例服务 → 外部适配”分层,便于扩展与测试:
server/:路由与依赖装配(Gin、CORS、中间件、各 handler 注册)handlers/:HTTP 层(参数解析/响应组装),保持对外 API 兼容services/uploader/:上传用例服务(统一上传流程、错误分类、消息生成)services/uploadprep/:上传前处理流水线(本地压缩/WebP;不再自动回退 TinyPNG)cloud/:存储 Provider(七牛/R2)与 Registry(按名称获取 provider)运行测试:
go test ./...
version: '3.8'
services:
app:
image: docker.cnb.cool/abigmiu/web_upload
ports:
- "3012:8080"
volumes:
- type: bind
source: /www/1panel/docker/compose/webupload/config.json
target: /root/config.json
environment:
- GIN_MODE=release
restart: unless-stopped
networks:
1panel-network:
external: true
确保已安装 Go 1.23 或更高版本(以 go.mod 为准)
克隆项目并进入目录:
git clone <your-repo-url>
cd <project-directory>
安装依赖:
go mod download
编译项目:
go build -o main .
运行应用:
./main
应用将在 http://localhost:8080 上运行
构建 Docker 镜像:
docker build -t image-optimizer .
运行容器(需要先配置好 config.json):
docker run -d -p 8080:8080 -v $(pwd)/config.json:/home/appuser/config.json:ro --name image-optimizer image-optimizer
config.json 是应用的配置文件,包含多个配置部分:
tinypng.api_key:TinyPNG API 密钥
"your_api_key_here"tinypng.allow_webp:是否允许输出 WebP 格式
true 或 falsefalseqiniu.access_key:七牛云 Access Key
qiniu.secret_key:七牛云 Secret Key
qiniu.bucket:七牛云存储空间名称
qiniu.region:七牛云存储区域
"z0" (华东), "z1" (华北), "z2" (华南), "na0" (北美), "as0" (东南亚)qiniu.preview_domain:预览域名
r2.account_id:Cloudflare 账户 ID
r2.access_key:R2 Access Key
r2.secret_key:R2 Secret Key
r2.bucket:R2 Bucket 名称
r2.endpoint:R2 S3 兼容 endpoint(可选)
https://<account_id>.r2.cloudflarestorage.com)r2.preview_domain:R2 预览域名(可选)
应用提供以下 API 接口:
GET /api/config/:type - 获取配置(type 支持:tinypng / local / qiniu / r2)POST /api/config/:type - 更新配置(type 支持:tinypng / local / qiniu / r2)POST /api/tinypng/compress - 上传并压缩图片POST /api/tinypng/compress-from-url - 从 URL 压缩图片GET /api/tinypng/usage - 获取 TinyPNG 使用量POST /api/tinypng/compress-to-s3 - 压缩并保存到 S3 存储(已移除)历史 legacy 接口 /api/qiniu/* 已删除,请使用统一上传接口 /api/upload 与 /api/upload-token(通过 provider=qiniu 选择七牛)。
POST /api/upload?provider=qiniu - 上传文件到七牛云POST /api/upload?provider=r2 - 上传文件到 Cloudflare R2GET /api/upload-token?provider=qiniu - 获取七牛云上传令牌上传接口支持通过 query 或 multipart form 字段传入以下参数,用于单次上传覆盖 config.json 和默认配置(优先级最高):
local_compress: 1/0(或 true/false)— 是否启用本地压缩(JPEG/PNG)local_webp: 1/0(或 true/false)— 是否启用本地转 WebP(JPEG/PNG → WebP)disable_tinypng: 1/0(或 true/false)— 本次请求禁用 TinyPNG(即使已配置 API Key)use_tinypng: 1/0(或 true/false)— 本次请求显式使用 TinyPNG(需要已配置 API Key;disable_tinypng=1 优先生效)注意:
use_tinypng=1,或使用 /api/tinypng/* 专用接口。POST /api/upload 的响应会包含 used_tinypng: true|false 字段,表示本次是否实际调用 TinyPNG。通过 provider=qiniu 可上传到七牛。
GET /health - 健康检查接口/ - Web 界面云端开发 https://cnb.cool/abigmiu/web_upload 直接fork 云原生开发, 环境已配置完成 本地开发
go mod download 安装依赖go run main.go 启动开发服务器请在相应位置添加许可证信息。