{
  "slug": "multipart-upload",
  "term": "Multipart upload",
  "aliases": [
    "Multipart object upload"
  ],
  "definition": "Multipart upload is an object-transfer process that sends numbered parts independently and assembles them into one object when the upload is completed.",
  "note": "Amazon S3 initiates an upload, accepts parts under an upload ID, and assembles the submitted parts in part-number order at completion. The part ETags submitted in the completion manifest are distinct from the destination object's current ETag used by an If-Match precondition. These details describe S3; another object-storage service may implement different limits or semantics.",
  "status": "shipping",
  "advantages": [
    {
      "text": "Parts can transfer in parallel, and a failed part transfer can be retried without retransmitting parts that have already succeeded.",
      "citationIds": [
        "c1"
      ]
    },
    {
      "text": "S3 CompleteMultipartUpload can apply If-None-Match or If-Match to the destination object when publishing the assembled upload.",
      "citationIds": [
        "c2"
      ]
    }
  ],
  "limitations": [
    {
      "text": "A multipart S3 object's ETag is not the MD5 digest of the complete object; integrity checks must use the documented checksum algorithm and full-object or composite scope.",
      "citationIds": [
        "c3",
        "c4"
      ]
    },
    {
      "text": "An in-progress S3 multipart upload does not reserve its destination key, so another writer can publish before its conditional completion.",
      "citationIds": [
        "c5"
      ]
    },
    {
      "text": "A 409 ConditionalRequestConflict at S3 completion requires a new multipart upload and re-uploading every part; merely repeating completion with the old upload ID is insufficient.",
      "citationIds": [
        "c2"
      ]
    },
    {
      "text": "Unfinished S3 uploads retain part storage until completed or aborted, so abandoned uploads need cleanup; the initial HTTP 200 at completion can also contain an embedded error that a raw API client must parse.",
      "citationIds": [
        "c1",
        "c2"
      ]
    }
  ],
  "related": [
    "object-storage",
    "entity-tag",
    "conditional-write"
  ],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-10-12",
  "citations": [
    {
      "id": "c1",
      "title": "Amazon S3: Uploading and copying objects using multipart upload",
      "url": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html",
      "accessed": "2026-10-12"
    },
    {
      "id": "c2",
      "title": "Amazon S3 API Reference: CompleteMultipartUpload",
      "url": "https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html",
      "accessed": "2026-10-12"
    },
    {
      "id": "c3",
      "title": "Amazon S3 API Reference: Object, ETag semantics",
      "url": "https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html",
      "accessed": "2026-10-12"
    },
    {
      "id": "c4",
      "title": "Amazon S3: Checking object integrity for data uploads",
      "url": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity-upload.html",
      "accessed": "2026-10-12"
    },
    {
      "id": "c5",
      "title": "Amazon S3: How to prevent object overwrites with conditional writes",
      "url": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-writes.html",
      "accessed": "2026-10-12"
    },
    {
      "id": "c6",
      "title": "Object ETags: checksums and conditional writes are different",
      "url": "https://hesela.com/analyses/object-etags-checksums-conditional-writes/",
      "accessed": "2026-10-12"
    }
  ]
}
