基于 Cloudflare Workers + R2 的文件分享服务,支持大文件分片上传,最大支持 100GB。
- 大文件支持:最大支持 100GB 文件上传
- 分片上传:大于 100MB 的文件自动使用分片上传,避免超时
- 分享密码:可为文件设置访问密码
- 过期自动清理:文件可设置过期时间,过期自动删除
- 临时下载链接:下载链接 5 分钟有效,安全可靠
- 二维码分享:一键生成分享二维码
- 并发上传:支持多文件同时上传
# 使用 wrangler CLI
wrangler login
wrangler init file-transfer在 Cloudflare Dashboard 中创建一个 R2 Bucket,名称默认为 file-transfer(可在配置中修改)。
在 wrangler.toml 中添加:
[[r2_buckets]]
binding = "file-transfer"
bucket_name = "file-transfer"wrangler deploy编辑 worker.js 中的 CONFIG 对象:
const CONFIG = {
// R2 Bucket 名称
BUCKET_NAME: 'file-transfer',
// 全局访问密码(留空则不启用)
ACCESS_PASSWORD: '',
// 文件分享密码密钥(用于生成临时下载签名)
SHARE_SECRET_KEY: '',
// 临时下载链接有效期(毫秒)默认5分钟
TEMP_LINK_EXPIRE: 5 * 60 * 1000,
// 文件大小限制(字节)默认 100GB
MAX_FILE_SIZE: 100 * 1024 * 1024 * 1024,
// 文件过期时间(毫秒)默认 7天,0 表示永不过期
FILE_EXPIRE_TIME: 7 * 24 * 60 * 60 * 1000,
// 允许的文件类型(留空数组表示允许所有)
ALLOWED_TYPES: [],
// 自定义域名(可选)
CUSTOM_DOMAIN: '',
// 最大并发上传数
MAX_CONCURRENT_UPLOADS: 3,
// 分片上传配置
CHUNK_SIZE: 50 * 1024 * 1024, // 分片大小 50MB
MULTIPART_THRESHOLD: 100 * 1024 * 1024, // 大于100MB启用分片
};POST /api/upload-url
Content-Type: application/json
{
"filename": "example.zip",
"size": 104857600,
"type": "application/zip",
"password": "optional-share-password"
}响应:
{
"uploadUrl": "...",
"fileId": "...",
"downloadUrl": "...",
"hasPassword": false,
"useMultipart": true,
"chunkSize": 52428800
}PUT /api/upload/{fileId}
Content-Type: {file-type}
[binary data]- 初始化分片上传
POST /api/multipart/create
Content-Type: application/json
{
"fileId": "...",
"totalChunks": 20
}- 上传分片
POST /api/multipart/upload?fileId={fileId}&chunkIndex=0
[binary chunk data]- 完成分片上传
POST /api/multipart/complete
Content-Type: application/json
{
"fileId": "..."
}访问分享链接:/d/{fileId}
如果需要密码,会显示密码输入页面。验证通过后会自动跳转到临时下载链接。
- 前端将大文件切分为 50MB 的分片
- 逐个上传分片,失败自动重试(最多 3 次)
- 同时上传 2 个分片,控制并发
- 后端将分片保存在 R2 中
- 下载时按顺序流式读取所有分片
- 所有下载链接都是临时的(默认 5 分钟有效)
- 支持设置文件访问密码
- 支持设置全局访问密码
- 文件可设置过期时间
- Cloudflare Workers 免费版有每日 100,000 次请求限制
- R2 存储有容量和出站流量限制
- 分片上传时,Workers 内存限制为 128MB,因此单分片大小不能超过 50MB
- 大文件下载时,由于需要流式读取多个分片,首字节时间可能稍长
Apache License 2.0