Skill: redisread/r2-uploader (version 1.0.3)

--- name: r2-uploader description: 使用 wrangler CLI 上传文件到 Cloudflare R2 对象存储，返回公开访问 URL。支持单文件上传、从远程 URL 直接上传、批量上传。当用户说"上传到 R2"、"传到 Cloudflare"、"存到 R2"、"上传图片/文件/附件"并提到 R2 或 wrangler 时使用。触发词：上传、R2、Cloudflare、存储、wrangler、bucket、对象存储、CDN 上传。 --- # R2 文件上传 使用 wrangler CLI 上传文件到 Cloudflare R2 对象存储。 ## 环境变量 | 变量 | 说明 | |------|------| | `$R2_BUCKET` | R2 存储桶名称（也可由用户指定） | | `$R2_DOMAIN` | 自定义域名（可选，未设置则用默认 URL） | ## 核心流程 ### 1. 定位文件 ```bash # 用户提供文件名时，查找文件 find ~ -name "<filename>" -type f 2>/dev/null | head -5 # 验证文件存在 ls -la "<file-path>" ``` ### 2. 生成路径 ```bash R2_PATH="agent/$(date +%Y%m%d)/$(basename "<file>")" ``` ### 3. 执行上传 ```bash wrangler r2 object put "$R2_BUCKET/$R2_PATH" --file "<file-path>" --remote ``` ### 4. 返回 URL ```bash # 有自定义域名 echo "https://$R2_DOMAIN/$R2_PATH" # 无自定义域名（默认） echo "https://pub-<account-id>.r2.dev/$R2_PATH" ``` ## 从 URL 直接上传 ```bash curl -sL "<url>" | wrangler r2 object put "$R2_BUCKET/$R2_PATH" --file - --remote ``` ## 常用管理命令 ```bash # 列出 buckets wrangler r2 bucket list # 删除对象 wrangler r2 object delete "<bucket>/<path>/<file>" --remote ``` ## 高级功能与错误处理 - **批量上传、并发上传**: 见 [references/advanced.md](references/advanced.md) - **错误处理、重试机制、特殊路径**: 见 [references/error-handling.md](references/error-handling.md)

path: references/advanced.md
content: # 高级用法

## 目录

- [批量上传](#批量上传)
- [并发上传](#并发上传)

---

## 批量上传

### 上传当前目录所有图片

```bash
for file in *.jpg *.png *.gif *.webp; do
  [ -f "$file" ] || continue
  wrangler r2 object put "$R2_BUCKET/agent/$(date +%Y%m%d)/$file" --file "$file" --remote && \
    echo "✓ $file"
done
```

### 上传指定目录所有文件

```bash
DIR="/path/to/dir"
for file in "$DIR"/*; do
  [ -f "$file" ] || continue
  wrangler r2 object put "$R2_BUCKET/agent/$(date +%Y%m%d)/$(basename "$file")" --file "$file" --remote && \
    echo "✓ $(basename "$file")"
done
```

---

## 并发上传

使用 `xargs` 并发上传（4 个进程）：

```bash
find . -name "*.jpg" -print0 | xargs -0 -P 4 -I FILE \
  sh -c 'wrangler r2 object put "$R2_BUCKET/agent/$(date +%Y%m%d)/$(basename FILE)" --file FILE --remote'
```

参数说明：
- `-P 4`: 同时运行 4 个进程
- `-print0` / `-0`: 正确处理含空格的文件名
- `sh -c`: 避免 `{}` 在复杂命令中的展开问题


path: references/error-handling.md
content: # 错误处理指南

## 目录

- [诊断流程](#诊断流程)
- [错误码对照表](#错误码对照表)
- [重试机制](#重试机制)
- [特殊路径处理](#特殊路径处理)

---

## 诊断流程

上传失败时按顺序排查：

```bash
# 1. 验证登录状态
wrangler whoami
# 未登录则运行: wrangler login

# 2. 验证 bucket 存在
wrangler r2 bucket list | grep "<bucket>"
# 不存在则创建: wrangler r2 bucket create <bucket>

# 3. 验证文件可读
ls -la "<file-path>"
```

---

## 错误码对照表

| 错误信息 | 原因 | 解决方案 |
|----------|------|----------|
| `The file does not exist` | 路径错误或空格问题 | `find` 查找正确路径 → 改用临时文件上传 |
| `Authentication required` | 未登录 | `wrangler login` |
| `Bucket not found` | bucket 不存在 | `wrangler r2 bucket create <name>` |
| `Network error` / `Timeout` | 网络问题 | 检查网络 → 启用重试机制 |
| `Permission denied` | 文件权限不足 | `chmod +r "<file>"` |

---

## 重试机制

```bash
# 最多重试 3 次，每次间隔 2 秒
for i in 1 2 3; do
  wrangler r2 object put "$R2_BUCKET/$R2_PATH" --file "<file>" --remote && \
    { echo "✓ 上传成功"; break; }
  echo "⚠ 第 $i 次失败，2秒后重试..."
  sleep 2
done
```

---

## 特殊路径处理

含空格或中文的路径可能导致上传失败，使用临时文件绕过：

```bash
TMP_FILE="/tmp/r2-upload-$(date +%s)"
cp "<source-path>" "$TMP_FILE"
wrangler r2 object put "$R2_BUCKET/$R2_PATH" --file "$TMP_FILE" --remote
rm "$TMP_FILE"
```


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)