logo
0
0
WeChat Login
feat(upload): 支持显式调用 TinyPNG

图片压缩与云存储服务

这是一个集成了 TinyPNG 图片压缩服务、七牛云存储和 Cloudflare R2 存储的 Web 应用。该应用提供了一个便捷的图片压缩和云存储解决方案。

功能特性

  • 使用 TinyPNG API 进行图片压缩
  • 支持 WebP 格式(可选)
  • 集成七牛云存储服务
  • 集成 Cloudflare R2 对象存储
  • 提供 RESTful API 接口
  • 简洁的 Web 界面

后端架构(重构后)

后端按“HTTP → 用例服务 → 外部适配”分层,便于扩展与测试:

  • server/:路由与依赖装配(Gin、CORS、中间件、各 handler 注册)
  • handlers/:HTTP 层(参数解析/响应组装),保持对外 API 兼容
  • services/uploader/:上传用例服务(统一上传流程、错误分类、消息生成)
  • services/uploadprep/:上传前处理流水线(本地压缩/WebP;不再自动回退 TinyPNG)
  • cloud/:存储 Provider(七牛/R2)与 Registry(按名称获取 provider)

运行测试:

go test ./...

部署方式

方法一:使用 Docker Compose(推荐)

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

方法二:直接运行

  1. 确保已安装 Go 1.23 或更高版本(以 go.mod 为准)

  2. 克隆项目并进入目录:

    git clone <your-repo-url> cd <project-directory>
  3. 安装依赖:

    go mod download
  4. 编译项目:

    go build -o main .
  5. 运行应用:

    ./main
  6. 应用将在 http://localhost:8080 上运行

方法三:使用 Docker

  1. 构建 Docker 镜像:

    docker build -t image-optimizer .
  2. 运行容器(需要先配置好 config.json):

    docker run -d -p 8080:8080 -v $(pwd)/config.json:/home/appuser/config.json:ro --name image-optimizer image-optimizer

config.json 配置项说明

config.json 是应用的配置文件,包含多个配置部分:

TinyPNG 配置

  • tinypng.api_key:TinyPNG API 密钥

    • 用途:用于访问 TinyPNG 的图片压缩服务
    • 获取方式:访问 TinyPNG 开发者页面 注册并获取 API 密钥
    • 格式:字符串,例如 "your_api_key_here"
  • tinypng.allow_webp:是否允许输出 WebP 格式

    • 用途:设置是否将压缩后的图片转换为 WebP 格式
    • 可选值:truefalse
    • 默认值:false
    • 说明:WebP 格式通常比 JPEG/PNG 更小,但并非所有浏览器都支持

七牛云配置

  • qiniu.access_key:七牛云 Access Key

    • 用途:用于验证您的七牛云账户身份
    • 获取方式:登录七牛云控制台,在个人面板中获取 Access Key
    • 格式:字符串
  • qiniu.secret_key:七牛云 Secret Key

    • 用途:用于签名请求的密钥,需要妥善保管
    • 获取方式:登录七牛云控制台,在个人面板中获取 Secret Key
    • 格式:字符串
    • 安全提示:请确保此密钥不被泄露
  • qiniu.bucket:七牛云存储空间名称

    • 用途:指定文件上传的目标存储空间
    • 获取方式:在七牛云控制台创建存储空间后获取名称
    • 格式:字符串
  • qiniu.region:七牛云存储区域

    • 用途:指定存储空间所在的数据中心区域
    • 常见值:"z0" (华东), "z1" (华北), "z2" (华南), "na0" (北美), "as0" (东南亚)
    • 格式:字符串
  • qiniu.preview_domain:预览域名

    • 用途:用于访问存储文件的自定义域名
    • 格式:字符串,可以为空
    • 说明:如果留空,将使用七牛云的默认域名

Cloudflare R2 配置

  • r2.account_id:Cloudflare 账户 ID

    • 用途:用于拼接默认 R2 S3 兼容 endpoint
    • 格式:字符串
  • r2.access_key:R2 Access Key

    • 用途:用于上传鉴权
    • 格式:字符串
  • r2.secret_key:R2 Secret Key

    • 用途:用于请求签名,需要妥善保管
    • 格式:字符串
  • r2.bucket:R2 Bucket 名称

    • 用途:指定上传目标存储桶
    • 格式:字符串
  • r2.endpoint:R2 S3 兼容 endpoint(可选)

    • 用途:覆盖默认 endpoint(默认值:https://<account_id>.r2.cloudflarestorage.com
    • 格式:字符串,可为空
  • r2.preview_domain:R2 预览域名(可选)

    • 用途:用于返回访问 URL;若为空则回退到 endpoint + bucket
    • 格式:字符串,可为空

API 接口

应用提供以下 API 接口:

配置管理

  • GET /api/config/:type - 获取配置(type 支持:tinypng / local / qiniu / r2
  • POST /api/config/:type - 更新配置(type 支持:tinypng / local / qiniu / r2

TinyPNG 服务

  • 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 R2
  • GET /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 优先生效)

注意:

  • 统一上传接口不会自动回退到 TinyPNG;如需 TinyPNG,请显式传 use_tinypng=1,或使用 /api/tinypng/* 专用接口。
  • POST /api/upload 的响应会包含 used_tinypng: true|false 字段,表示本次是否实际调用 TinyPNG。

通过 provider=qiniu 可上传到七牛。

其他

  • GET /health - 健康检查接口
  • / - Web 界面

安全注意事项

  1. 请妥善保管您的 API 密钥,不要将其提交到版本控制系统
  2. 建议使用环境变量或安全的密钥管理服务来存储敏感信息
  3. 定期更换 API 密钥以提高安全性

开发

云端开发 https://cnb.cool/abigmiu/web_upload 直接fork 云原生开发, 环境已配置完成 本地开发

  1. 安装 Go 1.21+
  2. 克隆仓库
  3. 运行 go mod download 安装依赖
  4. 运行 go run main.go 启动开发服务器

许可证

请在相应位置添加许可证信息。