# One-Click Upload

一个强大的命令行工具，用于一键上传文件和文件夹到云存储服务（阿里云 OSS、字节跳动 TOS）。

## 特性

- 🚀 **一键上传** - 简单的命令即可上传文件或整个文件夹
- 🔧 **多服务支持** - 支持阿里云 OSS 和字节跳动 TOS（火山引擎）
- 📊 **进度显示** - 实时显示上传进度和速度
- 🔄 **断点续传** - 支持大文件的断点续传功能
- 🔁 **自动重试** - 网络异常时自动重试上传
- ⚙️ **配置管理** - 支持多个服务配置，轻松切换
- 📱 **交互式界面** - 友好的命令行交互体验
- 🎯 **批量上传** - 支持文件夹批量上传
- 📝 **详细日志** - 完整的上传日志记录

## 安装

### 全局安装

```bash
npm i -g @xuanqikai/one-click-upload
```

### 更新到最新版本

```bash
# 更新到最新版本
npm update -g @xuanqikai/one-click-upload

# 或重新安装最新版本
npm install -g @xuanqikai/one-click-upload@latest
```

### 本地开发

```bash
git clone <repository-url>
cd one-click-upload
npm install
npm run build
npm link
```

## 快速开始

### 1. 添加服务配置

首次使用需要添加云存储服务配置：

```bash
# 交互式添加配置
one-upload config add

# 或使用简短命令
ou config add
```

支持的服务类型：

- **阿里云 OSS** - 需要提供 region、accessKeyId、accessKeySecret、bucket
  - 可选：CDN 自动刷新功能（需要 CDN AccessKey 和域名）
- **字节跳动 TOS** - 需要提供 region、accessKeyId、accessKeySecret、bucket
  - 可选：CDN 自动刷新功能（需要 CDN AccessKey 和域名）

### 2. CDN 自动刷新配置（可选）

如果使用阿里云 OSS 或字节跳动 TOS，可以配置 CDN 自动刷新功能：

```bash
# 在配置 OSS 或 TOS 服务时，会询问是否启用 CDN 自动刷新
one-upload config add

# 配置流程：
# 1. 选择服务类型：OSS 或 TOS
# 2. 输入基本配置：region、accessKeyId、accessKeySecret、bucket
# 3. 询问：Enable CDN auto refresh after upload for OSS/TOS? (y/n)
# 4. 如果选择 y，需要输入：
#    - CDN Access Key ID
#    - CDN Access Key Secret
#    - CDN Domain (如：https://cdn.example.com)
```

**CDN 自动刷新功能说明：**

- 🚀 **自动触发**：文件上传成功后自动刷新 CDN 缓存，无需额外命令
- 📱 **实时更新**：用户通过 CDN 访问到的文件始终是最新版本
- ⚙️ **可选功能**：不影响基本上传功能，可根据需要启用
- 🔧 **权限要求**：需要对应云服务商的 CDN API 权限
- 🌍 **服务支持**：支持 OSS（阿里云）和 TOS（字节跳动）两种服务
- 📊 **智能识别**：自动识别文件和目录类型，使用对应的刷新方式

**自动刷新工作流程：**

```
文件上传成功 → 自动构建 CDN URL → 执行缓存刷新 → 显示刷新结果
```

**示例：**

```bash
# 配置时启用 CDN 自动刷新后，上传文件时会自动刷新
one-upload photo.jpg images/
# ✅ 上传成功后会自动执行：✅ CDN 缓存刷新成功: https://cdn.example.com/images/photo.jpg (任务ID: xxxxx)
```

### 3. 查看和管理配置

```bash
# 列出所有配置
one-upload config list

# 显示配置详情
one-upload config show <service-name>

# 测试配置是否有效
one-upload config test <service-name>

# 设置默认服务
one-upload config default <service-name>
```

### 4. 上传文件和文件夹

#### 基本上传方式

```bash
# 交互式上传（推荐新手使用）
one-upload

# 直接上传文件到指定目录（保持原文件名）
one-upload photo.jpg images/
# 结果：images/photo.jpg

# 上传文件到多级目录
one-upload document.pdf docs/2024/reports/
# 结果：docs/2024/reports/document.pdf

# 上传整个文件夹（保持完整目录结构）
one-upload ./my-project projects/
# 结果：projects/src/index.js, projects/package.json 等
```

#### 高级上传选项

```bash
# 使用指定服务
one-upload file.txt remote/path/ --service my-oss

# 覆盖已存在的文件
one-upload file.txt remote/path/ --overwrite

# 禁用断点续传
one-upload large-file.zip remote/ --no-resume

# 设置重试次数和分片大小
one-upload file.txt remote/ --max-retries 5 --chunk-size 5
```

## 命令详解

### 配置管理

```bash
# 添加新的服务配置
one-upload config add

# 列出所有配置
one-upload config list

# 显示配置详情
one-upload config show <service-name>

# 更新配置
one-upload config update <service-name>

# 删除配置
one-upload config remove <service-name>

# 设置默认服务
one-upload config default <service-name>

# 测试配置
one-upload config test <service-name>
```

### 上传命令

```bash
# 基本上传
one-upload <local-path> [remote-path] [options]

# 上传选项
--service, -s <name>     指定使用的服务名称
--overwrite, -o          覆盖已存在的文件
--resume, -r             启用断点续传（默认开启）
--max-retries <number>   最大重试次数（默认3次）
--chunk-size <size>      分片大小，单位MB（默认1MB）
--contents-only          只上传文件夹内容（不包含文件夹名）
--cache-control <value>  自定义缓存控制头（如 "no-cache"）
--preload                上传完成后自动预热 CDN 缓存（需先配置 CDN）
--preload-options <json> 预热选项（JSON 格式，如：'{"area":"domestic","l2Preload":true}'）
```

## 配置示例

### 阿里云 OSS 配置

```json
{
  "name": "my-oss",
  "type": "oss",
  "config": {
    "region": "oss-cn-hangzhou",
    "accessKeyId": "your-access-key-id",
    "accessKeySecret": "your-access-key-secret",
    "bucket": "your-bucket-name",
    "endpoint": "https://oss-cn-hangzhou.aliyuncs.com"
  },
  "isDefault": true
}
```

### 字节跳动 TOS 配置

```json
{
  "name": "my-tos",
  "type": "tos",
  "config": {
    "region": "cn-beijing",
    "accessKeyId": "your-access-key-id",
    "accessKeySecret": "your-access-key-secret",
    "bucket": "your-bucket-name",
    "endpoint": "https://tos-cn-beijing.volces.com",
    "cdn": {
      "accessKeyId": "your-cdn-access-key-id",
      "accessKeySecret": "your-cdn-access-key-secret",
      "cdnDomain": "https://cdn.example.com",
      "autoRefresh": true
    }
  },
  "isDefault": false
}
```

## CDN 功能详解

### CDN 自动刷新 vs CDN 预热

工具提供了两种 CDN 相关功能，它们的作用和触发方式不同：

| 功能             | 触发方式              | 作用                                | 适用场景                                 |
| ---------------- | --------------------- | ----------------------------------- | ---------------------------------------- |
| **CDN 自动刷新** | 配置后自动触发        | 清除 CDN 缓存，强制回源获取最新内容 | 文件更新后需要立即清除旧缓存             |
| **CDN 预热**     | 使用 `--preload` 选项 | 主动将文件推送到 CDN 节点，提前缓存 | 大文件或重要文件，希望首次访问就命中缓存 |

**推荐流程：**

```
文件上传 → 自动刷新 CDN 缓存（清除旧内容）→ 使用 --preload 预热（填充新内容）
```

---

## CDN 自动刷新

### 功能说明

CDN 自动刷新在配置服务时启用，文件上传成功后**自动触发**，无需额外命令。它会清除 CDN 中的旧缓存，确保用户访问到最新内容。

### 配置方法

在配置 OSS 或 TOS 服务时，选择启用 CDN 自动刷新：

```bash
one-upload config add
# 当询问 "Enable CDN auto refresh after upload?" 时，选择 y
# 然后输入 CDN 相关配置信息
```

### 配置示例

**阿里云 OSS CDN 配置：**

```json
{
  "name": "my-oss",
  "type": "oss",
  "config": {
    "region": "oss-cn-hangzhou",
    "accessKeyId": "your-access-key-id",
    "accessKeySecret": "your-access-key-secret",
    "bucket": "your-bucket-name",
    "cdn": {
      "accessKeyId": "your-cdn-access-key-id",
      "accessKeySecret": "your-cdn-access-key-secret",
      "cdnDomain": "https://cdn.example.com",
      "autoRefresh": true
    }
  }
}
```

**字节跳动 TOS CDN 配置：**

```json
{
  "name": "my-tos",
  "type": "tos",
  "config": {
    "region": "cn-beijing",
    "accessKeyId": "your-access-key-id",
    "accessKeySecret": "your-access-key-secret",
    "bucket": "your-bucket-name",
    "cdn": {
      "accessKeyId": "your-cdn-access-key-id",
      "accessKeySecret": "your-cdn-access-key-secret",
      "cdnDomain": "https://cdn.example.com",
      "autoRefresh": true
    }
  }
}
```

### 使用示例

```bash
# 配置启用自动刷新后，上传文件时会自动刷新 CDN 缓存
one-upload photo.jpg images/
# ✅ 输出：✅ CDN 缓存刷新成功: https://cdn.example.com/images/photo.jpg (任务ID: xxxxx)

# 上传文件夹时，每个文件上传成功后都会自动刷新
one-upload dist/ websites/
# ✅ 每个文件上传成功后都会显示刷新结果
```

**注意事项：**

- ⚠️ 自动刷新需要消耗 CDN 刷新配额
- ⚠️ 刷新任务提交后需要一些时间才能生效（通常几分钟）
- ⚠️ 目录刷新会清除该目录下所有文件的缓存

---

## CDN 预热功能

### 功能说明

`--preload` 选项允许您在上传文件完成后**主动预热 CDN 缓存**，将文件推送到 CDN 节点，确保首次访问时就能命中缓存，提升访问速度。

### 配置要求

要使用 CDN 预热功能，您需要在服务配置中添加 `cdn` 配置项：

```json
{
  "name": "my-tos",
  "type": "tos",
  "config": {
    "region": "cn-beijing",
    "accessKeyId": "your-access-key-id",
    "accessKeySecret": "your-access-key-secret",
    "bucket": "your-bucket-name",
    "endpoint": "https://tos-cn-beijing.volces.com",
    "cdn": {
      "accessKeyId": "your-cdn-access-key-id",
      "accessKeySecret": "your-cdn-access-key-secret",
      "region": "cn-north-1",
      "cdnDomain": "https://cdn.example.com"
    }
  }
}
```

### 基本使用方法

```bash
# 上传单个文件并预热 CDN
one-upload photo.jpg images/ --preload

# 上传文件夹并预热所有文件
one-upload my-website/ websites/ --preload

# 上传并覆盖，同时预热
one-upload new-image.jpg images/ --overwrite --preload
```

### 预热选项（--preload-options）

使用 `--preload-options` 可以配置高级预热选项（JSON 格式）：

```bash
# 预热到国内节点
one-upload photo.jpg images/ --preload --preload-options '{"area":"domestic"}'

# 预热到全球节点
one-upload app.js js/ --preload --preload-options '{"area":"overseas"}'

# 启用二级预热（预热到 L2 节点，推荐重要文件使用）
one-upload index.html / --preload --preload-options '{"l2Preload":true,"area":"domestic"}'

# 自定义请求头预热
one-upload app.js js/ --preload --preload-options '{"area":"overseas","withHeader":{"Accept-Encoding":["gzip, deflate, br"]}}'

# 启用 HASH 预热（仅中国大陆有效）
one-upload large-file.zip files/ --preload --preload-options '{"l2Preload":true,"consistencyHash":true}'
```

### 预热选项说明

| 选项              | 类型      | 说明                                 | 示例值                                      |
| ----------------- | --------- | ------------------------------------ | ------------------------------------------- |
| `area`            | `string`  | 预热区域                             | `"domestic"`（国内）或 `"overseas"`（海外） |
| `l2Preload`       | `boolean` | 是否启用二级预热                     | `true` 或 `false`                           |
| `withHeader`      | `object`  | 自定义请求头                         | `{"Accept-Encoding":["gzip, deflate, br"]}` |
| `queryHashkey`    | `boolean` | 是否查询哈希键                       | `true` 或 `false`                           |
| `consistencyHash` | `boolean` | 是否启用一致性哈希（仅中国大陆有效） | `true` 或 `false`                           |

### 预热工作流程

```
文件上传成功 → CDN 缓存刷新（如果配置了自动刷新）→ CDN 预热 → 用户访问命中缓存
```

### 批量预热示例

```bash
# 上传整个目录并预热所有文件
one-upload dist/ production/ --preload

# 输出示例：
# 🔥 Starting CDN preload...
# Preloading 25 files...
# ✓ Preload completed: 25 successful, 0 failed
```

### 最佳实践

1. **重要文件使用二级预热**：对于首页、核心 JS/CSS 等关键文件，建议使用 `l2Preload: true`
2. **合理使用预热区域**：如果主要用户在国内，使用 `area: "domestic"`；面向全球用户使用 `area: "overseas"`
3. **结合自动刷新使用**：先刷新旧缓存，再预热新内容，确保用户访问到最新文件
4. **注意预热配额**：预热会消耗 CDN 预热配额，请根据实际情况使用

## 详细使用指南

### 文件上传示例

#### 1. 上传单个文件

```bash
# 上传图片到 images 目录
one-upload photo.jpg images/
# 远程路径：images/photo.jpg

# 上传文档到指定子目录
one-upload report.pdf documents/2024/
# 远程路径：documents/2024/report.pdf

# 上传视频文件
one-upload movie.mp4 videos/movies/
# 远程路径：videos/movies/movie.mp4
```

#### 2. 上传文件夹（两种模式）

**模式 1：上传整个文件夹（包含文件夹名）**

```bash
# 不带尾部斜杠 - 上传整个文件夹
one-upload my-website websites/
# 结果：
# websites/my-website/index.html
# websites/my-website/css/style.css
# websites/my-website/js/app.js
# websites/my-website/images/logo.png
```

**模式 2：只上传文件夹内容（不包含文件夹名）**

```bash
# 带尾部斜杠 - 只上传文件夹内容
one-upload my-website/ websites/
# 结果：
# websites/index.html
# websites/css/style.css
# websites/js/app.js
# websites/images/logo.png
```

**实际应用示例**

```bash
# 上传项目到指定目录（保持项目名）
one-upload my-project backup/
# 结果：backup/my-project/...

# 直接部署网站内容（不要项目文件夹名）
one-upload dist/ websites/production/
# 结果：websites/production/index.html, websites/production/assets/...
```

#### 3. 智能缓存策略

工具会根据文件类型自动设置合适的缓存策略：

```bash
# 自动缓存策略
one-upload website/ production/
# 结果：
# index.html -> no-cache (不缓存，便于更新)
# *.html -> max-age=3600 (1小时缓存)
# *.js, *.css -> max-age=31536000 (1年缓存)
# 图片文件 -> max-age=31536000 (1年缓存)

# 自定义缓存策略
one-upload index.html production/ --cache-control "max-age=3600"
one-upload assets/ cdn/ --cache-control "max-age=86400"
```

#### 4. 批量上传不同类型文件

```bash
# 上传多媒体文件夹
one-upload ./media-files storage/
# 自动处理：
# storage/images/photo1.jpg
# storage/videos/clip1.mp4
# storage/documents/readme.txt
# storage/audio/music.mp3
```

#### 5. CDN 预热功能

**基本预热**

```bash
# 上传文件并自动预热 CDN 缓存
one-upload index.html / --preload

# 上传目录并预热所有文件
one-upload dist/ /website/ --preload

# 覆盖上传并预热
one-upload new-image.jpg /images/ --overwrite --preload
```

**高级预热选项**

```bash
# 预热到 L2 节点，仅中国内地
one-upload index.html / --preload --preload-options '{"l2Preload":true,"area":"domestic"}'

# 预热到全球，包含自定义头部
one-upload app.js /js/ --preload --preload-options '{"area":"overseas","withHeader":{"Accept-Encoding":["gzip, deflate, br"]}}'

# 开启 HASH 预热（仅中国大陆有效）
one-upload large-file.zip /files/ --preload --preload-options '{"l2Preload":true,"consistencyHash":true}'
```

**预热工作流程**

```
文件上传 → CDN 缓存刷新 → 自动预热 → 用户访问命中缓存
```

**预热选项说明**

- `area`: 预热区域（`domestic` 中国内地，`overseas` 全球）
- `l2Preload`: 是否预热到 L2 节点（`true` 推荐重要文件，`false` 普通文件）
- `withHeader`: 自定义预热请求头部
- `queryHashkey`: 是否开启 hashkey 查询模式
- `consistencyHash`: 是否开启 HASH 预热（仅中国大陆有效）

### 实际使用场景

#### 1. 网站部署

```bash
# 构建并上传网站
npm run build
one-upload dist/ websites/my-site/ --overwrite
# 结果：网站文件上传到 websites/my-site/ 目录
```

#### 2. 备份文件

```bash
# 备份重要文档
one-upload ./important-docs backups/$(date +%Y%m%d)/
# 结果：backups/20240716/contract.pdf, backups/20240716/report.docx

# 备份代码项目
one-upload ./my-project backups/projects/my-project-$(date +%Y%m%d)/
```

#### 3. 内容管理

```bash
# 上传用户头像
one-upload avatar.jpg users/avatars/
# 结果：users/avatars/avatar.jpg

# 上传产品图片
one-upload product-images/ catalog/products/
# 结果：catalog/products/product1.jpg, catalog/products/product2.jpg

# 上传博客图片
one-upload blog-images/ blog/2024/07/
# 结果：blog/2024/07/image1.png, blog/2024/07/image2.jpg
```

#### 4. 开发工具集成

```bash
# CI/CD 脚本示例
#!/bin/bash
echo "构建项目..."
npm run build

echo "上传到 CDN..."
one-upload dist/ cdn/releases/v$(cat package.json | grep version | cut -d'"' -f4)/ --overwrite

echo "上传静态资源..."
one-upload assets/ static/assets/ --service cdn-oss

echo "部署完成！"
```

## 高级功能

### 断点续传

对于大文件（>1MB），工具会自动启用分片上传和断点续传：

```bash
# 启用断点续传（默认）
one-upload large-file.zip remote/large-file.zip --resume

# 禁用断点续传
one-upload large-file.zip remote/large-file.zip --no-resume
```

### 批量上传优化

```bash
# 调整分片大小以优化上传速度
one-upload folder/ remote/folder/ --chunk-size 5

# 增加重试次数以提高成功率
one-upload folder/ remote/folder/ --max-retries 5
```

## 最佳实践

### 1. 目录命名规范

```bash
# 推荐的目录结构
images/                 # 图片文件
  ├── avatars/         # 用户头像
  ├── products/        # 产品图片
  └── banners/         # 横幅图片

documents/             # 文档文件
  ├── contracts/       # 合同文件
  ├── reports/         # 报告文件
  └── manuals/         # 手册文件

backups/               # 备份文件
  ├── 2024/           # 按年份分类
  │   ├── 01/         # 按月份分类
  │   └── 02/
  └── projects/        # 项目备份
```

### 2. 文件上传策略

```bash
# 小文件直接上传
one-upload small-file.txt documents/

# 大文件启用断点续传
one-upload large-video.mp4 videos/ --resume --chunk-size 10

# 批量文件使用文件夹上传
one-upload ./photo-album gallery/2024/vacation/
```

### 3. 安全建议

- 定期轮换 AccessKey
- 使用最小权限原则配置 IAM 策略
- 不要在公共代码仓库中暴露配置信息
- 定期备份重要配置

## 故障排除

### 常见问题及解决方案

#### 1. 配置相关问题

```bash
# 问题：配置验证失败
# 解决：测试配置是否正确
one-upload config test <service-name>

# 问题：找不到默认服务
# 解决：设置默认服务
one-upload config default <service-name>

# 问题：配置文件损坏
# 解决：重新添加配置
rm ~/.one-upload-config.json
one-upload config add
```

#### 2. 上传相关问题

```bash
# 问题：上传失败
# 解决：增加重试次数
one-upload file.txt remote/ --max-retries 5

# 问题：大文件上传中断
# 解决：启用断点续传
one-upload large-file.zip remote/ --resume

# 问题：网络不稳定
# 解决：减小分片大小
one-upload file.txt remote/ --chunk-size 1
```

#### 3. 权限相关问题

- **AccessKey 权限不足**：确保 AccessKey 有对应 bucket 的写权限
- **Bucket 不存在**：检查 bucket 名称是否正确
- **Region 不匹配**：验证 region 设置是否与 bucket 所在区域匹配
- **网络访问限制**：检查防火墙和网络策略

### 调试和日志

```bash
# 查看配置文件
cat ~/.one-upload-config.json

# 查看上传历史日志
tail -f ~/.one-upload-history.log

# 清除配置重新开始
rm ~/.one-upload-config.json
rm ~/.one-upload-history.log
```

## 快速参考

### 命令速查表

#### 配置管理

```bash
one-upload config add                    # 添加新配置
one-upload config list                   # 列出所有配置
one-upload config show <name>            # 显示配置详情
one-upload config test <name>            # 测试配置
one-upload config default <name>         # 设置默认服务
one-upload config remove <name>          # 删除配置
```

#### 文件上传

```bash
one-upload                              # 交互式上传
one-upload <local> <remote>             # 直接上传
one-upload <local> <remote> -s <name>   # 指定服务上传
one-upload <local> <remote> --overwrite # 覆盖上传
one-upload <local> <remote> --resume    # 断点续传
one-upload <local> <remote> --preload   # 上传并预热 CDN
```

#### 常用选项

```bash
-s, --service <name>        # 指定服务名称
-o, --overwrite            # 覆盖已存在文件
-r, --resume               # 启用断点续传
--max-retries <number>     # 最大重试次数
--chunk-size <size>        # 分片大小(MB)
--preload                  # 上传后预热 CDN 缓存
--preload-options <json>   # 预热选项（JSON 格式）
--cache-control <value>    # 自定义缓存控制头
--help                     # 显示帮助
--version                  # 显示版本
```

### 典型使用模式

```bash
# 1. 首次使用
one-upload config add
one-upload config test <service-name>

# 2. 日常上传
one-upload photo.jpg images/
one-upload my-project backup/          # 上传整个文件夹
one-upload my-project/ backup/         # 只上传文件夹内容

# 3. 批量部署
one-upload dist/ websites/production/ --overwrite  # 部署网站内容

# 4. 大文件上传
one-upload large-file.zip backups/ --resume --chunk-size 10

# 5. CDN 功能使用
# 配置时启用自动刷新，上传后会自动刷新 CDN 缓存
one-upload photo.jpg images/

# 上传并预热 CDN（先刷新后预热）
one-upload index.html / --preload

# 高级预热选项
one-upload app.js js/ --preload --preload-options '{"area":"domestic","l2Preload":true}'
```

## 开发

### 本地开发

```bash
# 安装依赖
npm install

# 开发模式运行
npm run dev

# 构建
npm run build

# 运行测试
npm test

# 代码检查
npm run lint
```

### 项目结构

```
src/
├── commands/          # CLI 命令实现
├── config/           # 配置管理
├── uploaders/        # 上传器实现
├── utils/            # 工具函数
├── types/            # 类型定义
└── __tests__/        # 测试文件
```

## 贡献

欢迎提交 Issue 和 Pull Request！

## 许可证

MIT License

## 更新日志

## 完整使用示例

### 从零开始的完整流程

```bash
# 1. 全局安装
npm install -g one-click-upload

# 2. 添加 OSS 配置
one-upload config add
# 选择服务类型：Alibaba Cloud OSS
# 输入服务名称：my-oss
# 输入 Region：oss-cn-beijing
# 输入 Access Key ID：your-access-key-id
# 输入 Access Key Secret：your-access-key-secret
# 输入 Bucket Name：your-bucket-name
# 设为默认服务：Yes

# 3. 测试配置
one-upload config test my-oss
# ✓ Service 'my-oss' configuration is valid

# 4. 上传单个文件
one-upload photo.jpg images/
# ✓ Upload completed successfully
# File: photo.jpg
# Size: 2.5 MB
# URL: https://your-bucket.oss-cn-beijing.aliyuncs.com/images/photo.jpg

# 5. 上传文件夹
one-upload ./my-project projects/
# Upload Summary:
# ────────────────────────────────────────
# Total files: 15
# Successful: 15 (100.0%)
# Failed: 0
# Total size: 45.2 MB
# Duration: 12s

# 6. 查看所有配置
one-upload config list
# Configured Services:
# ────────────────────────────────────────────────────────────
# my-oss (default)
#   Type: Alibaba Cloud OSS
#   Bucket: your-bucket-name
#   Region: oss-cn-beijing
```

### 高级使用示例

```bash
# 添加 TOS 配置
one-upload config add
# 选择：ByteDance TOS (Volcano Engine)

# 使用特定服务上传
one-upload backup.zip backups/ --service my-tos

# 大文件上传（启用断点续传）
one-upload large-video.mp4 videos/ --resume --chunk-size 10

# 批量上传并覆盖
one-upload dist/ websites/production/ --overwrite --max-retries 3
```

## 更新日志

### v1.0.7

- ✨ 上传完成后改为**交互式选择 CDN 刷新 / 预热**，默认不执行，可重复操作直至选择“不执行”
- � **优化 CDN 刷新行为**：目录上传时优先使用目录级刷新，单文件仍按文件刷新
- 🔥 **优化 CDN 预热行为**：预热始终针对本次上传的所有文件，而不仅仅是目录
- 📊 **CDN 操作进度显示**：刷新和预热过程增加进度 spinner，仅输出成功 / 失败汇总
- 🧹 **精简 CDN 日志**：批量刷新/预热时不再逐条打印每个文件 URL

### v1.0.6

- 📚 添加一键更新 node 包脚本

### v1.0.5

- 📚 完善文档（CDN 功能说明、命令示例、配置说明、快速参考等）

### v1.0.4

- 🚀 CDN 功能增强（完善自动刷新与预热文档，补充配置示例和最佳实践）

### v1.0.3

- 🌐 修复 TOS 上传 Cache-Control 相关问题（不存在时不写入）

### v1.0.2

- 🎯 新增两种文件夹上传模式
  - `one-upload folder backup/` - 上传整个文件夹（包含文件夹名）
  - `one-upload folder/ backup/` - 只上传文件夹内容（不包含文件夹名）
- 🌐 修复 Windows 路径兼容性问题（统一正斜杠，修复多级子目录）
- 🚀 智能缓存策略（为 HTML/JS/CSS/图片设置合理默认缓存，并支持 `--cache-control` 自定义）

### v1.0.1

- 🐛 修复文件存在性检查和 `--overwrite` 解析问题
- 📝 补充文档和使用示例

### v1.0.0

- 初始版本发布：支持 OSS/TOS、断点续传、进度显示、配置管理、文件/文件夹上传等基础能力
