验证状态:已源码核验、未联调;适用基线:源码归纳 @ 2026-09-14
把 .bin 或 .img 固件写入临时 Tus 存储,取得后续固件保存/更新要提交的上传 URL。本页是 http-tus-firmware-upload 的唯一正本;上传完成不等于固件元数据已保存,更不等于设备已升级。
| 页面/功能 | 角色或空间分支 |
|---|---|
| 原始固件新增 | 当前 $spaceId |
| SpiritCam 固件新增 | 当前 $spaceId |
| 原始固件编辑 | 当前 $spaceId |
| SpiritCam 固件编辑 | 当前 $spaceId |
| 项 | 值 |
|---|---|
| operationId | http-tus-firmware-upload |
| endpoint | /main-service/system-api/upload,资源 URL 为响应 Location |
| methods | Web 客户端使用 POST 创建、PATCH 续传并可用 HEAD 恢复;Controller 还转发 DELETE/OPTIONS/GET |
| protocol | Tus 1.0.0;除 OPTIONS 外,请求/响应带 Tus-Resumable: 1.0.0 |
| auth | Authorization: Bearer <token>;无细粒度 @PreAuthorize,兜底规则要求认证 |
| CORS | 服务端显式暴露 Location 与 Upload-Offset |
需要有效登录态。浏览器先把文件名转小写检查 .img/.bin,但这只是交互预检;固件保存/更新入口会再次检查服务端记录的文件名扩展名。Controller 调用不带 ownerKey 的 process(request,response),因此 Tus 存储层没有按用户/租户隔离;任何已认证调用方若获知上传 URL,均可能查询、续传、下载或终止它。认证与空间见认证与空间。
| JSON 路径/参数 | JSON 类型 | 位置 | 必填 | 可空 | 默认值 | 枚举/范围/单位 | 说明 | 字段证据 |
|---|---|---|---|---|---|---|---|---|
Upload-Length |
decimal string | POST header | 当前 Web 是;Tus 与 Defer 二选一 | 否 | File.size | 非负字节数 | 当前客户端已知文件长度;服务也接受 defer 替代 | client 4.3.1;UploadLengthValidator |
Upload-Defer-Length |
string | POST header | 当前 Web 否;Tus 可替代 Length | 否 | 省略 | 只允许 | 当前 Web 不使用延后长度 | UploadDeferLengthValidator |
Upload-Metadata |
base64 pairs | POST header | Web 是;Tus 否;固件链要求 filename | 是 | 可省略 | 当前 Web 发 filename、filetype |
协议允许省略;后续固件扩展名校验依赖 filename | CreationPostRequestHandler;Firmware Controllers |
Content-Type |
string | PATCH header | 是 | 否 | application/offset+octet-stream |
Tus 1.0.0 | 当前客户端上传普通分块时固定发送 | tus-js-client 4.3.1 |
| 请求 body | bytes | PATCH body | 是 | 否 | — | 分块由客户端决定 | 从 Upload-Offset 位置续传 |
tus-js-client |
Upload-Offset |
decimal string | PATCH header | 是 | 否 | 0 | 字节偏移 | 必须与服务端偏移一致 | Tus server |
| 分块大小 | number | client option | 否 | 否 | Infinity |
当前 Web 未覆盖默认值 | 浏览器以整文件作为一个 PATCH body | tus-js-client 4.3.1 defaultOptions.chunkSize |
| upload resource URL | string | HEAD/PATCH/GET/DELETE path | POST 后是 | 否 | POST 的 Location |
服务生成 UUID 子路径 | 状态、续传、临时下载和终止均使用同一 URL | Tus handlers |
| HTTP 信号 | 出现条件 | 说明 | 证据 |
|---|---|---|---|
HTTP 201 + Location |
POST 创建成功 | 相对上传 URL;不是固件下载 URL | CreationPostRequestHandler |
HTTP 204 + Upload-Offset |
PATCH 成功 | 服务端接受后的新字节偏移 | CorePatchRequestHandler |
HTTP 204 + Upload-Offset/Upload-Length |
HEAD 成功 | 当前偏移及已知总长;另带 Cache-Control: no-store |
CoreHeadRequestHandler |
HTTP 204 + Tus-Version/Tus-Extension |
OPTIONS 成功 | 发现版本与扩展;因内部 max 为 0,不发 Tus-Max-Size |
CoreOptionsRequestHandler 与 extension handlers |
| HTTP 200 + bytes | GET 已完成上传 | 临时下载;给 Content-Length/Disposition/Type 和 metadata | DownloadGetRequestHandler |
| HTTP 204 | DELETE 已存在上传 | 终止并释放临时上传;之后 URL 不再可用 | TerminationDeleteRequestHandler |
| 空 body | 正常 Tus 响应 | 本接口不套 ApiResult JSON 信封 | FileUploadController |
客户端 onSuccess 只表示上传字节达到总长并取得 upload.url。原始固件表单还在浏览器计算整文件 MD5;必须等 MD5 就绪后再调用固件保存。最终持久化由创建固件包或创建 SpiritCam 固件完成。
按当前 Web 构造的创建请求头(JSON 仅用于表达 header 值):
按协议构造的创建成功响应头:
按协议构造的续传状态响应头:
Tus 错误是 HTTP/协议响应,不保证 ApiResult JSON:资源 URL 不存在时 HEAD/PATCH/GET/DELETE 为 404;未完成上传的 GET 为 422;PATCH 偏移不匹配为 409、Content-Type 错误为 415;超限为 413。参见HTTP 约定。
Web 重试间隔为 0、3、5、10、20 秒,tus-js-client 会先按资源偏移恢复;不要用新的 POST 盲目重试,否则可能产生孤立上传。PATCH 只有在服务端确认的 offset 上才可续传。DELETE 第一次成功为 204,再次调用同一 URL 为 404;若调用方把 204/404 都解释为“临时资源已不存在”,资源状态层面可安全收敛。GET 遇到 422 应先完成上传,不应原样重试。
服务没有调用 withMaxUploadSize,1.0.0-3.0 磁盘实现因而以 Long.MAX_VALUE 为内部上限;但本票核验的部署 Nginx 对每个 /main-service 请求限制 10G、读取超时 300 秒。当前客户端不分块,所以该部署的单文件实际入口上限是 10G;开发 Vite 代理超时为 90 秒。其他部署必须重新核验。
服务使用 tus-storage-path 保存临时上传,启用磁盘存储、线程本地缓存和临时下载扩展。定时任务每天调用 cleanup(),但应用没有设置上传过期周期,因此不能把它理解为“所有遗留上传一天后删除”。固件保存成功会复制文件并调用 deleteUpload 删除临时项。不要把临时 Location 当长期下载地址。
已闭合锁定依赖实现、协议响应和当前部署的 10G/300 秒限制;磁盘配额、其他部署代理限制及无 owner 隔离风险尚未联调。接入方上线前必须验证容量与访问隔离。
| 结论 | 状态 | 基线 | 依据 |
|---|---|---|---|
| Web Tus 版本、headers、metadata、重试与成功回调 | 已源码核验 | 依据 Web 端实现归纳(2026-09) | 四个固件表单共用的 TusUpload 上传封装 |
| 路由、methods、响应头与最终消费者 | 已源码核验 | 源码归纳 @ 2026-09-14 | 中心侧 Tus 上传端点与上传配置 |
| 锁定版本的 Tus 责任实现 | 已源码核验 | Maven Central tus-java-server:1.0.0-3.0 |
sources JAR 与 上游 1.0.0-3.0 release 交叉核对(创建/续传/校验/下载/终止请求处理器族) |
| Tus 1.0.0 header/status 语义 | 已协议核验 | tus 1.0.0 | 官方协议 Core 与 Creation |
| 当前部署上传限制 | 已源码核验 | 部署样例归纳(2026-09) | 部署 Nginx 的上传体积与超时限制(10G/300 秒) |
| 清单归属 | 已重新比对 | inventory(2026-09-14) | 清单层固件域条目 |
| 真实上传联调 | 未执行 | — | 未传输文件、未验证代理或磁盘限制 |