ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

RustFS 预签名上传 URL 如何限定最大上传大小

RustFS 预签名上传 URL 如何限定最大上传大小 RustFS 预签名上传 URL 如何限定最大上传大小【免费下载链接】rustfs2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting migration and coexistence with other S3-compatible platforms such as MinIO and Ceph.项目地址: https://gitcode.com/GitHub_Trending/rus/rustfs如果你的后端服务浏览器端上传常见需求是签发的预签名 URL 不能被客户端用来上传任意大的文件。RustFS 提供两个 RustFS 专属的查询参数解决这个问题——x-rustfs-max-content-length限制单个PutObject请求能上传的字节数x-rustfs-max-total-object-size限制一次分片上传multipart upload的最终对象总大小。两者都只能挂在 SigV4 预签名请求上超限的请求会被服务端拒绝并返回EntityTooLarge对象不会被发布。这两个机制的完整规则见 docs/operations/presigned-size-limits.md服务端实现入口在 rustfs/src/auth.rs参数解析与 rustfs/src/app/object/put.rsMaxContentLengthStream流式截断。两个参数的适用场景V1 单请求V2 单上传查询参数x-rustfs-max-content-lengthu64x-rustfs-max-total-object-sizeu64接受在仅 SigV4 预签名PutObject仅CreateMultipartUpload签名或预签名 SigV4其他操作携带该参数InvalidRequestCopyObject、multipart、GET、HEAD、DELETE、bucket 操作InvalidRequestUploadPart、CompleteMultipartUpload、AbortMultipartUpload、列操作、copy——这些读的是持久化的会话状态计量对象该请求解码后的请求体字节各分片逻辑对象字节actual_size之和不含纠删、加密或压缩引入的字节限制存放位置仅该请求multipart 会话元数据SUFFIX_MAX_TOTAL_OBJECT_SIZE创建时写入超限结果EntityTooLarge对象不发布出问题的UploadPart返回EntityTooLarge若已记录分片总和超限CompleteMultipartUpload同样被拒选哪个取决于上传方式一次性PUT用 V1浏览器分片上传大文件用 V2。共用的签名规则两个参数都适用这四条规则决定了参数“写在什么时候、怎么写才有效”后端必须在计算 SigV4 预签名之前把参数追加到请求 URI 上。它是规范化查询串的一部分签完后追加、删除或修改都会使签名失效浏览器因此无法篡改该限制。RustFS 只在请求被确认为 SigV4 已签名VerifiedPresignedRequest/VerifiedSigV4Request请求标记之后才解析该参数。未签名的请求携带同样查询串会被InvalidRequest拒绝。取值必须是无符号 64 位整数。重复、大小写变体、格式错误、负数或溢出值都返回InvalidRequest。参数名区分大小写必须精确为x-rustfs-max-content-length。不携带参数的请求普通认证或匿名上传行为不变。限定单请求上传大小x-rustfs-max-content-length文档给出的签发流程V1 示例来自 docs/operations/presigned-size-limits.mduri /photos/avatar.png uri ?x-rustfs-max-content-length10485760 presigned_url sigv4_presign(PUT, uri, credentials) # Return presigned_url to the browser. Never append the parameter afterwards.要点参数在sigv4_presign(PUT, uri, credentials)之前拼入 URI签名完成后绝不追加。1048576010 MiB是文档示例值按业务上限替换。行为分两种请求声明的Content-Length超过上限时在写入存储之前就被拒绝若请求体实际流式发送的字节数超过上限连接以EntityTooLarge截断且对象不会被发布。仅限单请求它不是跨多次 PUT 的累计上限也不是分片上传上限。不能与归档自动解包x-amz-meta-snowball-auto-extract组合会返回InvalidRequest。未知长度和 SigV4 streaming-chunked 上传仍在既有 PutObject 准入契约之外该参数不会使它们可用。如果后端用 AWS SDK 签发 URL可在 presign 请求的查询参数中带上x-rustfs-max-content-lengthAWS SDK 的 presigner 支持自定义查询参数签名会覆盖它。仓库的 e2e 用例 crates/e2e_test/src/presigned_negative_test.rs 展示了用aws_sdk_s3::presigning::PresigningConfig对预签名 URL 做签名与重放的完整接线方式可作参考。限定分片上传总大小x-rustfs-max-total-object-size文档给出的签发流程V2 示例uri /photos/archive.zip?uploads uri x-rustfs-max-total-object-size104857600 presigned_url sigv4_presign(POST, uri, credentials) # Return presigned_url to the browser. Never append the parameter afterwards.参数只加在CreateMultipartUpload这一步POST /bucket/key?uploads。后续流程RustFS 校验 SigV4 请求后把上限随 upload ID 持久化。浏览器用返回的 upload ID 上传各 partpart 请求本身不携带任何自定义参数。每次UploadPart以及指向该上传的UploadPartCopy只有在“当前累计逻辑总量 本分片大小”不超过预算时才被放行。覆盖已存在的 part 号采用替换语义先释放旧 part 占用的大小再准入新 part 的大小。CompleteMultipartUpload会对已记录的分片重新求和超过上限则拒绝完成。带上限上传的几个属性未知长度或负长度的 part 会以UnexpectedContent拒绝而不是无界缓冲。未声明长度的分片请求不会被无上限缓存带上限的 part 在创建临时分片前先获取上传级写锁准入并持有 per-upload staging 许可以限制本地在途数据。读取请求体期间锁会释放最终校验和 rename 前再重新获取因此Complete和Abort不会被慢上传卡住客户端停发时请求体 stall 超时会释放 staging 许可。创建时未携带参数的上传保持无上限。强制检查在 multipart 数据面每个节点执行。滚动升级期间只把带上限的上传路由到已带 V2 实现的节点没有该实现的节点会把内部元数据当作未知处理无法执行限制。如何验证生效文档定义的判定标准都体现在 S3 错误码上用客户端直接观察响应即可参数没参与签名或事后追加请求因签名不匹配被拒绝——这正是该机制的安全设计客户端无法修改限制值。参数格式非法重复、大小写变体、负数、溢出、非 u64返回InvalidRequest。参数挂在错误的操作上如CopyObject、UploadPart返回InvalidRequest。声明Content-Length超限 / 分片累计超限返回EntityTooLarge对象不发布。分片长度未知或为负返回UnexpectedContent。仓库回归套件 crates/e2e_test/src/presigned_negative_test.rs 的做法值得照搬向真实服务器发送被拒绝的预签名请求断言 HTTP 状态码和响应 XML 中的Code.../Code如CodeEntityTooLarge/Code、CodeInvalidRequest/Code以此固定拒绝契约而不依赖底层由谁完成校验。限制与边界这两个查询参数是 RustFS 专属扩展不属于 S3 标准参数参数名区分大小写且只能出现一次。V1 参数只对预签名PutObject生效普通认证请求携带它同样会被InvalidRequest拒绝。限制计量的是逻辑数据量V1 计量解码后的请求体字节V2 计量各分片actual_size之和均不含纠删、加密或压缩引入的开销。V2 依赖所有节点都具备该实现multipart_max_total_object_size/multipart_size_limit_from_metadata见 crates/ecstore/src/set_disk/ops/multipart.rs混合版本滚动升级期间带上限的上传必须只路由到新节点。服务端参数解析细节parse_presigned_put_max_content_length、parse_presigned_multipart_max_total_object_size位于 rustfs/src/auth.rsV1 的流式截断由MaxContentLengthStreamrustfs/src/app/object/put.rs实现需要深入排障时可从这两处入手。【免费下载链接】rustfs2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting migration and coexistence with other S3-compatible platforms such as MinIO and Ceph.项目地址: https://gitcode.com/GitHub_Trending/rus/rustfs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进