b957d3c92ce3400d3223232f134d28f0278e0c35
uploads3
一个用于批量上传本地目录文件到 S3 兼容对象存储的命令行工具,基于 GoFrame 与 minio-go SDK。
功能特性
- 批量扫描本地目录并保持原有层级结构上传至 S3
- 并发上传,默认
10,可配置,最大50 - 通过
config/local.yaml管理多套 S3 配置(如 MinIO、七牛 S3) - 统一路径映射:自动将 Windows
\转换为对象存储使用的/
环境要求
- Go
1.23+(仓库声明了toolchain go1.24.8,本地使用 Go 1.23/1.24 均可) - 可访问你的 S3 兼容对象存储(如 MinIO、七牛云 S3)
安装与构建
- 直接构建(Windows/Linux/macOS 均可)
- Windows:
go build -o uploads3.exe . - Linux/macOS:
go build -o uploads3 .
- Windows:
- 运行
- Windows:
./uploads3.exe -p <本地目录> -u <S3根路径> -w <并发数> - Linux/macOS:
./uploads3 -p <本地目录> -u <S3根路径> -w <并发数>
- Windows:
可选(需安装 GoFrame CLI 与 Make):make build 会在 bin/ 下生成各平台二进制。
配置说明
应用读取 config/local.yaml 的 s3 配置,示例:
s3:
type: "default" # 当前使用的配置名称(default/qiniu/...)
default:
provider: "minio"
accessKey: "<你的AccessKey>"
secretKey: "<你的SecretKey>"
address: "<你的S3地址>:<端口>" # 如 minio: ay.cname.com:9000
ssl: false # https 用 true
url: "http://host/bucket/" # 直链或 CDN 前缀,可选,用于拼接访问地址
bucketName: "<桶名>"
qiniu:
provider: "qiniu"
accessKey: "<你的AccessKey>"
secretKey: "<你的SecretKey>"
address: "s3.cn-south-1.qiniucs.com"
ssl: true
url: "https://attachment.example.com/"
bucketName: "<桶名>"
s3.type决定使用哪套配置(上例为default)。address是 S3/MinIO 的服务地址;ssl选择是否 https。bucketName是目标桶名;上传时的对象 Key 将由本地路径与upload_path映射生成。
使用指南
命令行参数:
-p, --path本地文件夹路径(必须)-u, --upload_pathS3 上传根路径(必须)-w, --worker并发数,默认10,最大50
运行示例(Windows):
./uploads3.exe -p D:\data\images -u cdn.yoyaworld.com/upload/images -w 20
运行示例(Linux/macOS):
./uploads3 -p /data/images -u cdn.yoyaworld.com/upload/images -w 20
路径映射规则
- 工具会扫描
path下所有文件,并以相对层级映射到upload_path。 - 对象 Key 生成规则:用
upload_path替换本地绝对路径中的path前缀,并统一改为/。- 例如:
- 本地文件:
D:\data\images\a\b.jpg - 参数:
-p D:\data\images,-u cdn.yoyaworld.com/upload/images - 对象 Key:
cdn.yoyaworld.com/upload/images/a/b.jpg
- 本地文件:
- 例如:
并发与性能
-w控制同时上传的并行 worker 数,范围1~50。- 大量小文件场景建议适度提高并发;网络与目标 S3 的限流会影响实际吞吐。
日志输出
- 使用 GoFrame 日志,默认打印到控制台,包含当前上传进度
(已传/总数)与对象 Key。 - 失败时会记录错误日志;可根据输出排查凭据与网络问题。
常见问题
- 连接失败:检查
address与ssl是否匹配、端口是否可达。 - 认证失败:核对
accessKey/secretKey、桶权限与跨区 endpoint 设置。 - Key 不符合预期:确认命令行的
path与upload_path是否书写正确,尤其是 Windows 路径需要使用转义或用双引号包裹。
开发者提示
- 入口:
main.go调用internal/cmd/cmd.go的命令。 - S3 封装:
internal/logic/s3/s3.go基于minio-go,从config/local.yaml读取配置。 - 若需要扩展不同提供商,可在
config/local.yaml增加新节,并通过s3.type切换。
许可证
- 使用
MIT许可,详见LICENSE文件。