一个基于 Go + Gin 的 S3 预签名上传服务,内置拖拽上传前端页面。
export AWS_REGION=us-west-2
export LISTEN_ADDR=:50001
# 生产建议填写明确域名,多个域名用逗号分隔
export CORS_ALLOW_ORIGINS=http://localhost:50001,http://localhost:5173
go run .启动后访问:http://localhost:50001/
服务启动后会同时运行:
- HTTP 服务(默认
LISTEN_ADDR=:50001) - MCP server(TCP
:50002)
MCP 暴露工具:generate_upload_url(逻辑与 handleUploadURL 一致)。
export AWS_REGION=us-west-2
export LISTEN_ADDR=:50001
go run .支持的方法:
initializetools/listtools/call
tools/call 参数示例:
{
"name": "generate_upload_url",
"arguments": {
"bucket": "your-bucket",
"key": "uploads/demo.txt",
"contentType": "text/plain",
"expiresIn": 120
}
}- 前端拖拽/选择文件。
- 调用后端
POST /upload-url获取预签名 URL。 - 浏览器直接
PUT到 S3。
前端直传 S3 时会有两段跨域:
- 前端页面 -> 本服务 (
/upload-url) - 前端页面 -> S3 预签名地址 (
PUT)
通过环境变量 CORS_ALLOW_ORIGINS 控制允许来源:
*:允许所有来源(仅开发调试建议)https://app.example.com,https://admin.example.com:生产白名单
需要在桶上配置 CORS(示例):
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["PUT", "GET", "HEAD"],
"AllowedOrigins": [
"http://localhost:50001",
"http://localhost:5173"
],
"ExposeHeaders": ["ETag"],
"MaxAgeSeconds": 600
}
]如果前端和 API 不同域名,CORS_ALLOW_ORIGINS 与 S3 AllowedOrigins 都要包含前端域名。