首次提交

This commit is contained in:
2025-10-30 12:19:31 +08:00
commit 054cd6cf34
48 changed files with 1155 additions and 0 deletions

95
README.md Normal file
View File

@@ -0,0 +1,95 @@
# 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: `./uploads3.exe -p <本地目录> -u <S3根路径> -w <并发数>`
- Linux/macOS: `./uploads3 -p <本地目录> -u <S3根路径> -w <并发数>`
可选需安装 GoFrame CLI Make`make build` 会在 `bin/` 下生成各平台二进制
## 配置说明
应用读取 `config/local.yaml` `s3` 配置示例
```yaml
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_path` S3 上传根路径必须
- `-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` 文件