这是一个面向 Vercel 的 URL/Base64 中转工具。
核心目标:
- 所有
/api/*响应强制使用Content-Type: text/plain; charset=utf-8 - 小文件保持原来的完整 Base64 JSON 返回方式
- 大文件自动切换到分片模式
- 分片优先使用上游 HTTP
Range,避免每次下载整个大文件 - 如果上游忽略
Range,会退化为流式跳过并只保留目标片段 - 无数据库、无环境变量,适合直接部署到 Vercel
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff注意:虽然普通响应正文是 JSON 字符串,但 HTTP MIME 类型仍然是 text/plain。
当前安全阈值:
2,700,000 原始二进制字节
这会编码成约:
3,600,000 Base64 字符
2,700,000 可以被 3 整除,因此正常的非末尾分片不会产生 Base64 = padding。
请求:
/api/fetch?url=<目标URL>
如果文件不超过阈值,返回:
{"success":true,"chunked":false,"url":"...","filename":"file.aar","size_bytes":123456,"content_base64":"UEsDB..."}
同样请求:
/api/fetch?url=<目标URL>
如果文件超过阈值,不会把整个 Base64 塞进一次响应,而是返回一个很小的 manifest:
{"success":true,"chunked":true,"size_bytes":6000000,"chunk_size_bytes":2700000,"total_chunks":3,"chunk_url_template":"/api/fetch?url=...&part={part}",...}
然后分别访问:
/api/fetch?url=<目标URL>&part=0
/api/fetch?url=<目标URL>&part=1
/api/fetch?url=<目标URL>&part=2
每个 part=N 的响应正文是纯 Base64 文本,不再包 JSON:
UEsDBBQAAAAI...
分片响应还会附带:
X-Content-Encoding: base64
X-Chunk-Index: 0
X-Chunk-Start: 0
X-Chunk-End: 2699999
X-Total-Size: 6000000
X-Total-Chunks: 3还原文件时,按 part=0,1,2... 顺序分别 Base64 解码,再把得到的二进制块顺序拼接即可。
部署后直接访问:
https://你的域名.vercel.app/api/fetch?url=https://repo1.maven.org/maven2/top/yukonga/miuix/kmp/miuix-ui-android/0.9.3/miuix-ui-android-0.9.3.aar
如果它被判定为大文件,先得到 manifest,再继续访问:
https://你的域名.vercel.app/api/fetch?url=https://repo1.maven.org/maven2/top/yukonga/miuix/kmp/miuix-ui-android/0.9.3/miuix-ui-android-0.9.3.aar&part=0
之后将 part 递增即可。
- 新建 GitHub 仓库。
- 把本目录全部内容上传到仓库根目录。
- 在 Vercel 选择 Add New -> Project。
- Import 这个 GitHub 仓库。
- Framework Preset 选择 Other。
- 不需要环境变量。
- 点击 Deploy。
Linux/macOS:
./deploy-vercel.shWindows:
deploy-vercel.cmd或者:
npm run deploy/api/fetch?url=<URL>:自动判断完整模式或分片模式。/api/fetch?url=<URL>&part=N:读取第 N 个 Base64 分片。/api/extract?url=<URL>:DOCX/XLSX/TXT/CSV/MD/JSON/HTML/RTF 文本提取。/api:查看接口说明。
大文件分片请求优先向上游发送:
Range: bytes=<start>-<end>
Accept-Encoding: identity如果上游返回 206 Partial Content,只读取目标范围。
如果上游无视 Range 并返回 200 OK,程序会流式读取响应,跳过前面的数据,只保留当前分片窗口,不把整个文件一次性塞进响应。
程序优先通过 HEAD 获取 Content-Length。
如果 HEAD 不可用,会尝试一个小范围 Range 探测。如果上游既不提供文件大小、也不支持 Range,仍可进入分片模式;此时 total_chunks 可能是 null,调用方从 part=0 开始递增,直到接口返回 HTTP 416。
接口统一使用:
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
res.end(JSON.stringify(payload));这样 JSON helper 不会把 MIME 改回 application/json。vercel.json 也配置了相同响应头作为兜底。
Based on upstream project: https://github.com/mariklolik/claude_tool
Original project license: MIT.