PRIVATE DOWNLOAD RELAY

R2 Proxy

把远端资源或本地文件存入 Cloudflare R2,再生成支持断点续传的链接。

连接

主 Token 只保存在当前浏览器会话中。

新建任务

支持批量 URL、重定向和自定义源站请求头。

未连接
文件完成后保留 24 小时。

上传本地文件

分片上传到 R2,并生成无需鉴权的公开分享链接。

PUBLIC LINK
上传接口需要主 Token;分享链接不需要鉴权。

任务

进度按完成的 R2 分片更新。

连接后创建第一个下载任务。
REFERENCE

使用帮助

通过网页、REST API 或命令行管理临时下载任务。

01

快速开始

设置服务地址和主 Token,然后创建任务。

鉴权 除健康检查、签名下载链接和 /share/:id 外,所有 API 都需要 Authorization: Bearer <MASTER_TOKEN>
Shell · 创建任务

返回值中的 job.id 是后续查询、签名、取消和删除操作使用的 JOB_ID

网页端可在资源 URL 输入框中每行填写一个链接并批量创建任务;批量模式会为每个链接自动推断文件名。

02

查询与 CLI 下载

等待状态变成 ready,再生成临时下载链接。

Shell · 查询状态
export JOB_ID="从创建任务响应中取得的 UUID"

curl --fail-with-body --silent \
  -H "Authorization: Bearer $R2_PROXY_TOKEN" \
  "$R2_PROXY_URL/api/jobs/$JOB_ID" | jq

浏览器 / curl

适合小文件或快速测试,使用一个标准 HTTP 下载连接。

Shell · 生成签名并用 aria2c 下载
SIGNED_URL=$(curl --fail-with-body --silent \
  -X POST \
  -H "Authorization: Bearer $R2_PROXY_TOKEN" \
  "$R2_PROXY_URL/api/jobs/$JOB_ID/sign" | jq -r '.url')

aria2c -c -x 8 -s 8 -k 4M \
  --file-allocation=none \
  "$SIGNED_URL"
依赖 macOS 可运行 brew install aria2 jq。签名链接与文件同时 到期;文件剩余多久,链接就最多有效多久。
Shell · 取消或删除
# 取消正在运行的任务
curl --fail-with-body --silent -X POST \
  -H "Authorization: Bearer $R2_PROXY_TOKEN" \
  "$R2_PROXY_URL/api/jobs/$JOB_ID/cancel" | jq

# 删除任务记录、R2 对象和未完成分片
curl --fail-with-body --silent -X DELETE \
  -H "Authorization: Bearer $R2_PROXY_TOKEN" \
  "$R2_PROXY_URL/api/jobs/$JOB_ID"
03

本地上传与公开分享

上传操作需要主 Token,生成的分享下载链接无需任何鉴权。

公开链接 链接格式为 /share/<UPLOAD_ID>。任何拿到链接的人都能 下载文件,文件到期或被删除后链接立即失效。
Shell · 上传一个不超过 64 MiB 的文件
export FILE="./example.bin"
export FILE_SIZE=$(wc -c < "$FILE" | tr -d ' ')

UPLOAD=$(curl --fail-with-body --silent \
  -X POST "$R2_PROXY_URL/api/uploads" \
  -H "Authorization: Bearer $R2_PROXY_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"filename\":\"$(basename "$FILE")\",\"contentType\":\"application/octet-stream\",\"contentLength\":$FILE_SIZE}")

UPLOAD_ID=$(printf '%s' "$UPLOAD" | jq -r '.job.id')
PART=$(curl --fail-with-body --silent \
  -X PUT "$R2_PROXY_URL/api/uploads/$UPLOAD_ID/parts/1" \
  -H "Authorization: Bearer $R2_PROXY_TOKEN" \
  -H "Content-Type: application/octet-stream" \
  -H "X-Upload-Size: $FILE_SIZE" \
  --data-binary "@$FILE" | jq -c '.part')

curl --fail-with-body --silent \
  -X POST "$R2_PROXY_URL/api/uploads/$UPLOAD_ID/complete" \
  -H "Authorization: Bearer $R2_PROXY_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"parts\":[$PART]}" | jq

大于 64 MiB 的文件请直接使用网页,浏览器会自动切片并显示上传进度。

04

REST API

响应均为 JSON;删除成功时返回空的 204 响应。

方法 路径 用途
GET /health 无需鉴权的健康检查
POST /api/jobs 创建拉取任务,返回 202
GET /api/jobs 列出全部任务摘要
GET /api/jobs/:id 读取任务进度和 Workflow 状态
POST /api/jobs/:id/sign 生成临时签名下载 URL
POST /api/jobs/:id/cancel 终止任务并清理未完成上传
POST /api/uploads 初始化本地 multipart 上传
PUT /api/uploads/:id/parts/:part 上传一个 64 MiB 分片
POST /api/uploads/:id/complete 合并分片并返回公开分享 URL
DELETE /api/jobs/:id 删除任务及其 R2 文件
GET /api/files/:id Bearer 或签名鉴权下载,支持单段 Range
HEAD /api/files/:id 读取文件大小、ETag 和下载元数据
GET /share/:id 无需鉴权的公开下载,支持 Range 和 HEAD
queued probing downloading ready

任一步骤失败会进入 error;主动取消会进入 canceled

05

创建任务字段

POST /api/jobs 接收以下 JSON 对象。

字段 类型 说明
url string 必填,任意绝对 HTTP(S) 资源地址
filename string | null 可选;为空时从 URL 或响应头推断
headers object 可选;发往源站的请求头,例如源站 Authorization
forwardSensitiveHeaders boolean 跨域重定向后是否继续发送敏感请求头,默认 false
JSON · 带源站鉴权
{
  "url": "https://example.com/private/model.safetensors",
  "filename": "model.safetensors",
  "headers": {
    "Authorization": "Bearer <SOURCE_TOKEN>"
  },
  "forwardSensitiveHeaders": false
}
06

安全与保留规则

这个服务按私人下载中转设计。

  • 不要把主 Token、源站 Token 或签名下载链接分享给其他人。
  • 主 Token 只保存在当前浏览器的 sessionStorage
  • 跨域重定向默认移除 AuthorizationCookieProxy-Authorization
  • 文件在任务完成 24 小时后自动从 R2 删除。
  • 本地上传生成的是公开链接,不包含 Token,也不执行下载鉴权。
  • 下载支持断点续传;无效或超出文件范围的 Range 返回 416。