Skip to content

Readest Lite v8.23.4 — 修复大文件上传截断(issue #8)

Latest

Choose a tag to compare

@cshdotcom cshdotcom released this 22 Oct 16:03

修复:超过 10MB 的书籍上传被截断(#8)

现象:无论是否经过反向代理(Caddy 或本机直连),超过 10M 的图书无法完整同步到服务器,落盘文件只有约 10MB。

根因(本地已复现并验证):Next.js 16 会对被 middleware 匹配的、带请求体的请求做 cloneable body 包装,缓冲上限由 experimental.proxyClientMaxBodySize 控制,默认 10MB。超限时包装流被静默提前关闭,middleware 执行完后截断流被换回原始 req,API handler 只能收到前 10,485,696 字节。/api/storage/_put(书籍签名 PUT 直传)、/api/send/inbox/file(收件箱)、/api/readera-import(ReadEra 备份导入)都在 matcher 范围内,故所有客户端(Web / Tauri / Android 壳 App / 浏览器扩展)的大文件上传都被截断。

修复内容:

  1. middleware matcher 排除大文件二进制端点(api/storage/_put、api/send/inbox/file、api/readera-import):原始请求流直达 API handler,彻底绕过 10MB clone 缓冲,同时避免大文件 2 倍内存驻留。安全性不受影响——_put 鉴权由 query 中 HMAC 签名提供,CORS 由各 handler 内 corsAllMethods 提供。
  2. 恢复 v8.8.0 的 webUpload 自动分块(某次重构中丢失,回归):文件 >5MB 自动切成 5MB 块串行上传(&index=N&total=M)后触发服务端流式合并(&merge=1)。修复 Cloudflare 反代下大文件上传 524 超时的回归,并让每块 body 远小于任何代理层限制,作为第二道防线。

验证:

  • 复现测试:修复前 12MB/15MB 均被截断为 10,485,696 字节;修复后整传 3/12/15/30MB、分块 12MB(3 块+merge)、收件箱 15MB、签名 URL 下载 12MB 全部完整(大小 + md5 校验一致)
  • 登录 / 常规 API 无回归;tsc --noEmit 0 错误;biome lint/format 通过
  • CI 远程验证:Docker 镜像构建 + 容器 Smoke test(启动/登录/权限/同步 API)全部通过

升级方式:

docker compose pull   # 或
docker compose up -d --build

镜像:ghcr.io/cshdotcom/readest-lite:8.23.4 / latest