以 Tus 上传固件文件

验证状态:已源码核验、未联调;适用基线:源码归纳 @ 2026-09-14

用途与 App 场景

.bin.img 固件写入临时 Tus 存储,取得后续固件保存/更新要提交的上传 URL。本页是 http-tus-firmware-upload 的唯一正本;上传完成不等于固件元数据已保存,更不等于设备已升级。

Web 使用位置

页面/功能 角色或空间分支
原始固件新增 当前 $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 服务端显式暴露 LocationUpload-Offset

前置条件与权限

需要有效登录态。浏览器先把文件名转小写检查 .img/.bin,但这只是交互预检;固件保存/更新入口会再次检查服务端记录的文件名扩展名。Controller 调用不带 ownerKeyprocess(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 发 filenamefiletype 协议允许省略;后续固件扩展名校验依赖 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 值):

1{
2  "Tus-Resumable": "1.0.0",
3  "Upload-Length": "4096",
4  "Upload-Metadata": "filename ZmlybXdhcmUuYmlu,filetype YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFt",
5  "Authorization": "Bearer <token>"
6}

按协议构造的创建成功响应头:

1{
2  "Location": "/main-service/system-api/upload/upload-01",
3  "Tus-Resumable": "1.0.0"
4}

按协议构造的续传状态响应头:

1{
2  "Upload-Offset": "4096",
3  "Upload-Length": "4096",
4  "Tus-Resumable": "1.0.0"
5}

错误与边界

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) 清单层固件域条目
真实上传联调 未执行 未传输文件、未验证代理或磁盘限制