一个基于Go+Gin的文件转存API服务,支持将网络上的任意文件下载并上传到阿里云OSS,无文件类型和大小限制。
本项目采用类似于api-server的分层架构:
transfer/
├── cmd/ # 应用入口
│ └── main.go
├── app/ # 应用层
│ ├── controller/ # 控制器
│ ├── middleware/ # 中间件
│ └── router/ # 路由
├── internal/ # 内部包
│ ├── dto/ # 数据传输对象
│ └── service/ # 业务逻辑
├── pkg/ # 公共包
│ ├── config/ # 配置管理
│ ├── logger/ # 日志管理
│ └── resp/ # 响应工具
├── config/ # 配置文件
├── docs/ # API文档
├── scripts/ # 脚本文件
├── go.mod
├── Makefile
└── README.md
- 🚀 高性能的Go+Gin框架
- 📁 支持图片、视频、音频等多种媒体格式
- ☁️ 自动上传到阿里云OSS
- 🔄 内置重试机制和容错处理
- 📏 文件大小限制保护
- 🌐 CORS跨域支持
- 📊 健康检查接口
- 📖 Swagger API文档
- 📝 结构化日志记录
- JPEG (.jpg)
- PNG (.png)
- GIF (.gif)
- WebP (.webp)
- MP4 (.mp4)
- AVI (.avi)
- MOV (.mov)
- MP3 (.mp3)
- WAV (.wav)
- AAC (.aac)
复制配置模板文件并编辑:
cp config/local.yaml.example config/local.yaml然后编辑 config/local.yaml 文件,填入你的阿里云OSS配置:
aliyun_oss:
access_key_id: "你的AccessKey_ID"
access_key_secret: "你的AccessKey_Secret"
endpoint: "你的OSS端点"
bucket: "你的存储桶名称"
region: "你的区域"注意: config/local.yaml 文件已添加到 .gitignore,不会被提交到git仓库,可以安全地存储真实的配置信息。
make depsmake run
# 或者
go run cmd/main.go服务将在 http://localhost:8199 启动。
make docs访问 http://localhost:8199/swagger/index.html 查看API文档。
GET /api/v1/media/health
POST /api/v1/media/transfer
请求体:
{
"url": "https://example.com/image.jpg"
}成功响应:
{
"code": 0,
"message": "success",
"data": {
"success": true,
"message": "Media transferred successfully",
"oss_url": "https://wavespeed-oss-xxx.oss-ap-southeast-1.oss-accesspoint.aliyuncs.com/media/2025/09/23/14-30-45/image.jpg",
"original_url": "https://example.com/image.jpg",
"file_size": 1024000,
"content_type": "image/jpeg"
}
}curl -X POST http://localhost:8199/api/v1/media/transfer \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/sample.jpg"}'./scripts/test_api.sh
server:
port: 8199 # 服务端口
mode: debug # 运行模式: debug, release
domain: http://localhost:8199 # 服务域名logger:
level: info # 日志级别: debug, info, warn, error
output: console # 输出类型: console, file, both
file:
path: ./logs/transfer.log
max_size: 100 # 单个文件最大尺寸(MB)
max_age: 7 # 文件保留天数
max_backups: 10 # 最大保留文件数
compress: true # 是否压缩media_transfer:
download_timeout: 30 # 下载超时时间(秒)
max_file_size: 104857600 # 最大文件大小(字节) 100MB
retry_count: 3 # 重试次数
allowed_domains: [] # 允许的域名列表,空表示允许所有- 重试机制: 下载失败时自动重试(默认3次)
- 超时控制: 下载超时保护(默认30秒)
- 文件大小限制: 防止下载过大文件(默认100MB)
- 媒体类型验证: 只允许上传支持的媒体格式
- URL格式验证: 确保输入URL格式正确
# 构建应用
make build
# 运行应用
make run
# 开发模式(生成文档并运行)
make dev
# 生成API文档
make docs
# 安装依赖
make deps
# 格式化代码
make fmt
# 运行测试
make test
# 清理构建文件
make cleanFROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go mod tidy && go build -o bin/transfer cmd/main.go
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/bin/transfer .
COPY --from=builder /app/config ./config
CMD ["./transfer"]生产环境建议通过环境变量 TRANSFER_CONFIG 指定配置文件:
export TRANSFER_CONFIG=production.yaml- 请确保阿里云OSS配置信息正确
- 建议在生产环境中使用HTTPS
- 根据实际需求调整文件大小限制和超时时间
- 定期清理OSS中的临时文件
- 监控API调用频率,避免被目标网站限制
- 生产环境建议设置日志输出为文件模式