{
  "synthetic": true,
  "execution": "Teaching record only; no live integration tested",
  "slug": "multipart-upload-completion-ledger",
  "group": "operations",
  "title": [
    "A large-file upload needs a completion ledger",
    "大文件上传，需要完成清单"
  ],
  "intro": [
    "A design studio’s customer portal may receive a large artwork archive over an unreliable connection. Before commissioning resumable uploads, agree which parts are durable, which need retry and what proves the final object exists. A full progress bar is not that proof.",
    "设计工作室门户可能在不稳定网络下接收大型素材。委托断点上传前，应约定哪些分片已持久保存、哪些需重试，以及什么证明最终文件存在。进度条走满不能证明完成。"
  ],
  "facts": [
    [
      "Cloudflare R2 documents multipart completion and resumable parts. Non-final parts have a5 MiB minimum and must share a size; incomplete uploads have their own lifecycle.",
      "Cloudflare R2说明分片完成及接续，非末片至少5MiB且大小相同；未完成上传有独立生命周期。",
      "https://developers.cloudflare.com/r2/objects/upload-objects/#multipart-upload"
    ]
  ],
  "columns": [
    [
      "Synthetic20MiB archive",
      "Part ledger",
      "Required next step"
    ],
    [
      "合成20MiB归档",
      "分片清单",
      "下一步"
    ]
  ],
  "example": [
    [
      [
        "Part 1 /8 MiB",
        "Stored; ETagE1 retained",
        "Keep part 1"
      ],
      [
        "第1片／8MiB",
        "已存，保留ETag E1",
        "保留第1片"
      ]
    ],
    [
      [
        "Part 2 /8 MiB",
        "Connection lost; result unknown",
        "Reconcile or retry part 2 under upload identity"
      ],
      [
        "第2片／8MiB",
        "连接丢失，结果未知",
        "按上传身份核对或重传第2片"
      ]
    ],
    [
      [
        "Part 3 /4 MiB final",
        "Stored; ETagE3 retained",
        "Valid smaller final part in model"
      ],
      [
        "第3片／末片4MiB",
        "已存，保留ETag E3",
        "本例末片可较小"
      ]
    ],
    [
      [
        "All parts later confirmed",
        "Ordered completion manifest + final object readback",
        "Verify size 20 MiB and content integrity"
      ],
      [
        "后续各片均确认",
        "有序完成清单及最终对象回读",
        "核对20MiB及内容完整性"
      ]
    ]
  ],
  "steps": [
    [
      "Define object key, upload identity, byte size, part numbering and a secure authenticated ownership model. Use MiB consistently:20 MiB equals 20,971,520 bytes.",
      "定义对象键、上传身份、字节数、分片号及安全身份归属；统一MiB，本例20MiB为20,971,520字节。"
    ],
    [
      "Persist confirmed part references and distinguish unknown responses from confirmed failures. Check provider resume semantics rather than restarting the whole file automatically.",
      "保存确认分片引用，区分响应未知与确认失败；核对平台接续规则，不能自动重传整文件。"
    ],
    [
      "Complete with the verified ordered part set, read the final object and verify the agreed checksum/size. Define abandoned-upload cleanup separately from completed-file retention.",
      "以核验的有序分片集完成，再回读最终对象及约定校验值和大小；废弃分片清理与成品保留分别约定。"
    ]
  ],
  "result": [
    "The part sizes sum to 20 MiB. Until part 2 and final completion are verified, the archive remains incomplete. An ETag should be treated according to the provider’s documented semantics, not assumed to be a universal whole-file checksum.",
    "三片合计20MiB；第2片及最终完成未核验前，归档仍未完成。ETag须按平台语义使用，不能假定是通用整文件校验值。"
  ],
  "accept": [
    "Demonstrate interrupted transfer, resumed part, final readback and abandoned-upload cleanup in an authorised test environment. Keep user upload permissions separate from transport success.",
    "在获准测试环境演示中断、接续、最终回读及废弃清理；上传权限与传输成功分开。"
  ],
  "limit": [
    "Synthetic byte ledger only; no bucket, real file or cloud API was accessed. Actual request limits, quotas, lifecycle settings, malware review and confidentiality still need implementation evidence.",
    "仅合成字节清单；未访问存储桶、真实文件或云API。请求限制、额度、生命周期、恶意文件复核及保密仍需实际证据。"
  ]
}
