Skip to navigation

Large uploads fail

Fix multipart upload, checksum and ETag problems with big files.

This page helps when small files upload but large ones fail, when an upload stalls or keeps retrying, or when a large file’s ETag does not match its MD5. It also covers uploads rejected because of an encryption or storage class option.

Large files are uploaded in parts (multipart upload). Most tools switch to multipart by themselves — for example aws s3 cp for files over 8 MB.

Quick fixes

You seeMost likely causeFix
XAmzContentSHA256Mismatch, BadDigest or a checksum error — only on large filesNew AWS CLI and SDK versions send default checksums that Zata rejects on multipart uploadsSet checksums to “when required”
AWS SDK for Java v2: XAmzContentSHA256Mismatch on every uploadThe same default checksums (SDK 2.30 and newer)Set checksums to “when required”
AWS CLI: argument of type 'NoneType' is not a container or iterable on large filesUsually the checksum problem aboveSet the checksum settings, or run with --debug
EntityTooLargeA file over 5 GB sent in one request, without multipartUse multipart
EntityTooSmallA part other than the last is smaller than 5 MBUse bigger parts
InvalidPartThe part list sent at the end does not match the uploaded parts (ETag or part number)Build the list again from the parts Zata received
NoSuchUploadWrong upload ID, or the upload was already completed or cancelledStart a new upload
Upload is slow, stalls or times outToo many parallel parts for the connectionLower concurrency, raise retries
The ETag of a large file is not its MD5Normal for multipart uploads — not corruptionCheck size and checksum instead
The bucket uses more storage than its filesUnfinished multipart uploadsClean them up
InvalidRequest with encryption turned on in the toolZata does not accept server-side encryption requestsTurn the tool’s encryption option off
InvalidArgument with a storage class setZata has one storage classLeave the storage class empty or STANDARD

Checksum errors with new AWS tools

AWS CLI and AWS SDK versions released from January 2025 add checksums to uploads by default. Zata rejects them on multipart uploads: small files upload, large files fail with XAmzContentSHA256Mismatch. This is the usual cause when a tool “worked before an upgrade”, or when rclone works but another tool fails.

ToolAffected versionsWhat fails
AWS CLIv2.23 and newerlarge (multipart) uploads
boto3 / botocore1.36 and newerlarge (multipart) uploads
AWS SDK for JavaScript v33.729 and newerlarge (multipart) uploads
AWS SDK for Java v22.30 and newerevery upload, even small files

rclone is not affected, and neither are versions older than the ones above.

Fix: tell the tool to calculate checksums only when they are required.

aws configure set request_checksum_calculation when_required --profile zata
aws configure set response_checksum_validation when_required --profile zata

This adds two lines to the [profile zata] section of ~/.aws/config:

request_checksum_calculation = when_required
response_checksum_validation = when_required

In --debug output, these default checksums show up as x-amz-checksum-crc64nvme or x-amz-checksum-crc32 headers (often with x-amz-sdk-checksum-algorithm or x-amz-trailer). The x-amz-content-sha256 header is part of normal signing and is not the problem.

Full setup for each tool: AWS CLI, Python, JavaScript, Java, Go.

Size and part limits

LimitValueError when exceeded
One upload without multipart5 GB at mostEntityTooLarge
Size of each part, except the last5 MB at leastEntityTooSmall
Number of parts in one upload10,000 at most—

A multipart upload can be much larger than 5 GB. Parts may be uploaded in any order.

  • EntityTooLarge: use a command that uploads in parts. For example, use aws s3 cp instead of aws s3api put-object, which always sends the file in one request.
  • EntityTooSmall: raise the part size in your tool or code.
  • If the final “complete” step fails, Zata removes that upload. Start the upload again.

Upload stalls or keeps retrying

First upload one small and one large file with the same tool. If only the large one fails with an error code, use the table at the top. If there is no error code but the upload is slow or times out, upload fewer parts at the same time and allow more retries:

aws configure set s3.max_concurrent_requests 4 --profile zata

Check that a large file arrived intact

For a multipart upload, the ETag is not the file’s MD5. It ends in -N, where N is the number of parts, so a different ETag does not mean the file is damaged. Compare the size and a checksum instead:

aws s3api head-object --bucket my-bucket --key bigfile.iso --profile zata --query ContentLength
aws s3 cp s3://my-bucket/bigfile.iso ./check.iso --profile zata
sha256sum bigfile.iso check.iso

The size must equal the local file’s size, and the two SHA-256 sums must match. With rclone, rclone check ./folder zata:my-bucket/folder --one-way --download compares the content of files uploaded in parts.

Clean up unfinished uploads

An upload that was never completed or cancelled keeps its parts, and they keep using storage. List them and cancel the ones you do not need:

aws s3api list-multipart-uploads --bucket my-bucket --profile zata
aws s3api abort-multipart-upload --bucket my-bucket --key KEY --upload-id UPLOAD_ID --profile zata

Take KEY and UPLOAD_ID from the list. Cancelling deletes the parts uploaded so far. A sub-user key may get AccessDenied on the list — use the account owner’s key.

To clean up automatically, add a lifecycle rule with Discard unfinished uploads. See Lifecycle rules.

Test a multipart upload step by step

If another app cannot upload large files, do each multipart step by hand with the AWS CLI. The step that fails shows the problem.

1

Make a test file in parts

Every part except the last must be at least 5 MB (Linux or macOS):

head -c 12M /dev/urandom > bigfile.bin
split -b 5M -d bigfile.bin part-

This makes part-00 and part-01 (5 MB each) and part-02 (2 MB).

2

Start the upload

UPLOAD_ID=$(aws s3api create-multipart-upload --bucket my-bucket --key test/bigfile.bin --query UploadId --output text --profile zata)
echo "$UPLOAD_ID"
3

Upload the parts

aws s3api upload-part --bucket my-bucket --key test/bigfile.bin --part-number 1 --body part-00 --upload-id "$UPLOAD_ID" --profile zata
aws s3api upload-part --bucket my-bucket --key test/bigfile.bin --part-number 2 --body part-01 --upload-id "$UPLOAD_ID" --profile zata
aws s3api upload-part --bucket my-bucket --key test/bigfile.bin --part-number 3 --body part-02 --upload-id "$UPLOAD_ID" --profile zata
4

List the parts Zata received

aws s3api list-parts --bucket my-bucket --key test/bigfile.bin --upload-id "$UPLOAD_ID" --query '{Parts: Parts[].{PartNumber: PartNumber, ETag: ETag}}' --output json --profile zata > parts.json
5

Complete the upload

aws s3api complete-multipart-upload --bucket my-bucket --key test/bigfile.bin --upload-id "$UPLOAD_ID" --multipart-upload file://parts.json --profile zata
StepErrorMeaning
Upload the partsXAmzContentSHA256MismatchThe default checksums — set them to “when required”
CompleteEntityTooSmallA part other than the last is under 5 MB
CompleteInvalidPartAn ETag or part number in parts.json does not match — run the list step again
Any stepNoSuchUploadWrong upload ID, or the upload was already completed or cancelled
Any stepAccessDeniedThe key is not allowed this action on the bucket

If these steps work with the AWS CLI but your app still fails, the app most likely sends the default checksums. Set its checksum option to “when required”, or use the environment variables in the Any app tab above.

Options to turn off in your tool

Some tool options ask for S3 features that Zata does not offer. Every upload fails until you turn them off:

ErrorOptionWhat to do
InvalidRequestServer-side encryption (SSE-S3 / AES256, SSE-C, SSE-KMS)Turn it off. To encrypt your data, use a tool that encrypts before upload, such as an rclone crypt remote, restic or Duplicati
InvalidArgumentA storage class such as GLACIER, DEEP_ARCHIVE or STANDARD_IALeave the storage class empty, or set STANDARD
NotImplementedAnother S3 feature Zata does not offerTurn that option off

See the real error

Zata’s error responses contain an error code but no message text, so look for the code. The debug output contains your access key ID — remove it before you share the output.

ToolRunLook for
AWS CLIadd --debug to the command<Code> in the Response body line, and x-amz-checksum- headers in the request
rcloneadd -vv --dump headersthe HTTP status and api error with the code in the last line
s3fsmount with -f -o dbglevel=infothe failing request and its HTTP response code
boto3catch ClientErrore.response["Error"]["Code"]

Still stuck?

Contact Zata support (see Get support) and include:

  • the tool and its version (aws --version, rclone version, or your SDK version)
  • the endpoint you use and the region of the bucket (Indore or Mumbai)
  • the file size, and the part size and concurrency if you set them
  • the exact error code, and the RequestId from the error response
  • the debug output from above, with access keys removed