ZIP from an interrupted download

A download that stopped short does not scramble a ZIP — it truncates it. The index at the tail of the file (the central directory) never arrived, so extractors refuse the whole archive even though the files stored earlier are still there. Getting those files back is a matter of reading the archive from the front, and it does not require handing it to a server.

Your file never leaves your device — repair runs in your browser. 0 bytes uploaded.

Your data is the big block — usually intact. What breaks is the small index. Repair rebuilds it.

Drop a file here or browseTap to choose a file

ZIP · Office · PDF · video · JPG · PNG · RAR/7z · SQLite — repaired right here in your browser. Nothing is uploaded

0 bytes uploadedFree: 3 repairs/day — up to 500 MB video, 100 MB docs & archives, 50 MB photos. Free download. Single repair €5.90. No account required.

Fix it now

  1. Drop the file
  2. Repair runs locally
  3. Download the result

When a browser download, a cloud "download all", or a copy off a flaky connection stops before the last byte, the .zip that lands on your disk is truncated — shorter than the server ever meant it to be. WinRAR and 7-Zip say "Unexpected end of archive", Info-ZIP unzip says "End-of-central-directory signature not found", Windows Explorer says "The Compressed (zipped) Folder is invalid", and Python's zipfile throws BadZipFile: File is not a zip file. All of them are reacting to the same thing: the file's index, which lives at the very end, is missing. Drop the partial archive above and the tool ignores the absent index and scans the entries from the top in your browser, extracting every file that was fully written before the cut — nothing is uploaded.

Why an interrupted download breaks a ZIP

A ZIP is written front-to-back but read back-to-front. Every file you added is stored as a local file entry — a header beginning with the signature PK\x03\x04, carrying the name, the compression method (0 = stored, 8 = deflate), and then the compressed bytes — but the authoritative index of where those entries live is the central directory (PK\x01\x02 records) written last, immediately before the 22-byte End Of Central Directory record, PK\x05\x06. An extractor opens the file by seeking to the end and scanning backward for that PK\x05\x06 signature — up to roughly 65,557 bytes back, because the record ends with a variable-length comment field. Only after it finds the EOCD does it know how many entries the archive holds and where each central-directory record begins.

Now picture the download that stopped at 70%. The bytes that never arrived are the ones written last: the central directory and the EOCD. The extractor seeks to the end, scans backward, never sees PK\x05\x06, and gives up before touching a single file. That is the exact source of unzip's "End-of-central-directory signature not found", 7-Zip's and WinRAR's "Unexpected end of archive", Explorer's "The Compressed (zipped) Folder is invalid", and macOS Archive Utility's "Unable to expand … (Error 2)". None of them mean the stored files are scrambled — they mean the table of contents at the tail is gone.

Interrupted downloads are especially prone to this because of how many ZIPs are generated. An archive assembled on the fly by a server — a "download all" from cloud storage, a GitHub source tarball's ZIP sibling, an export bundle — is usually streamed: general-purpose bit-flag bit 3 (0x0008) is set, the compressed size and CRC-32 in each local header are left as zero, and the real values are appended after the entry's data in a data descriptor (PK\x07\x08). For those archives the central directory is the only place the sizes are guaranteed, so losing the tail is doubly damaging to a normal extractor. The half-written file your browser left behind — a Chrome/Edge .crdownload, a Firefox .part, or a .zip that is simply shorter than the response's Content-Length — still carries every complete entry up to the cut and nothing after it.

What the forward scan recovers from a partial ZIP

The salvage does not need the missing index at all, because in a ZIP every local entry is self-describing. Instead of seeking to the end, the tool scans forward from offset 0, stopping at each PK\x03\x04 local header it finds, reading the file name and compression method, and then decompressing the deflate stream that follows. Deflate is self-terminating: a stream is a sequence of blocks and the final block carries a BFINAL bit set to 1, so the decoder can find where an entry's data ends even when the local header's size field was left at zero by a streamed writer. When the stream terminates cleanly the tool records a recovered file, skips any trailing PK\x07\x08 data descriptor, and continues to the next PK\x03\x04. This runs as plain TypeScript in your tab — no unzip binary, nothing transmitted.

The result is that every file fully written before the interruption comes back, in order, with its original name and directory path. If the download died in the middle of the fourth of ten files, you get the first three intact and a fourth that is partial or dropped; the six that never arrived cannot be conjured, but they were never the point. A "stored" entry (method 0, no compression — common for already-compressed contents such as JPEGs or MP4s placed inside the ZIP) is even simpler to salvage: its bytes are copied verbatim up to the truncation point, so even a half-arrived large file frequently yields a usable leading fragment rather than nothing at all.

The honest limit: the missing tail is gone

No tool can return bytes that never reached your disk. If the connection dropped at 70%, the final 30% of the compressed data does not exist locally, and nothing — not this page, not WinRAR's "Repair", not a paid recovery suite — can reconstruct it. The one real fix for the missing tail is to download the archive again from the source, ideally with a client that supports HTTP range requests so an interrupted transfer can resume where it stopped instead of restarting. If the server sent an ETag or a Content-Length, comparing that length against the size of your partial file tells you exactly how much is actually missing.

A few honest edges. A ZIP that is encrypted (a password set at zip time, general-purpose bit 0) cannot be scanned without the password, because the entry data is ciphertext with no deflate structure to follow. A very large archive written in ZIP64 format keeps its own trailing structures — the ZIP64 EOCD record (PK\x06\x06) and its locator (PK\x06\x07) — which are lost with the tail exactly like the classic EOCD, but the forward scan still recovers the local entries regardless of format. And a download so short that only a fragment of the very first local header arrived has nothing to walk. Everything between those extremes is fair game.

Because the whole operation happens in your browser, the archive is never copied to a server just to look inside it — which matters when a "download all" bundle holds tax documents, exported chat histories, or private source code. You can open the Network tab, run the recovery, and confirm that 0 bytes of the file ever leave your machine.

What this can and can't fix

Can fix

  • A ZIP whose download was interrupted, losing the central directory and EOCD — entries written before the cut are recovered by scanning local headers from the top
  • Streamed / server-generated ZIPs (bit-flag bit 3 set, sizes in a PK\x07\x08 data descriptor) whose deflate streams self-terminate on the BFINAL bit
  • Browser partial-download files (Chrome/Edge .crdownload, Firefox .part) that hold the complete entries received so far
  • "Stored" (uncompressed) entries copied verbatim up to the truncation point, including a usable leading fragment of the file that straddled the cut
  • ZIP64 archives whose trailing EOCD structures were lost but whose local entries survive

Can't fix

  • Any entry whose compressed data was located after the truncation point — those bytes are not on your disk
  • The single file that straddled the cut, which may come back partial or not at all
  • Encrypted / password-protected ZIPs when the password is not supplied (entry data is ciphertext)
  • A download so short that only a fragment of the first local header arrived
  • The exact CRC-32 and original sizes for entries whose data descriptor and central-directory records were in the missing tail

If a repair fails, we tell you why (missing data versus broken structure), and you are never charged for a failed repair.

FAQ

Why does my ZIP say "unexpected end of archive" right after downloading?

Because the download was interrupted before the last bytes arrived. A ZIP keeps its index — the central directory and the End Of Central Directory record — at the very end of the file, and that tail is exactly what a cut-off transfer loses. The files stored earlier in the archive are usually intact; the extractor simply can't find the table of contents that tells it they exist.

Can I recover the files without re-downloading the whole thing?

Often, yes — every file that finished arriving before the interruption. The tool scans forward for each local file header (PK\x03\x04) and decompresses the entry, so a partly-arrived archive still gives up its complete files. What it cannot return is any file whose data came after the cut; for those you do need to download again.

My browser left a .crdownload or .part file. Is that recoverable?

It can be. A .crdownload (Chrome/Edge) or .part (Firefox) is just the partially-downloaded bytes under a temporary name. Drop it here as-is (or rename a copy to .zip) and the forward scan extracts whatever complete entries it contains. It will not contain files that never downloaded.

Should I just download it again instead?

If you can, yes — a fresh, complete download is always the cleanest fix, and a client that supports HTTP range requests can often resume the interrupted transfer rather than starting over. Recovery is for when the source is gone, slow or rate-limited, or when you only need the files that already arrived rather than the whole bundle.

Does recovering the ZIP upload it anywhere?

No. The archive is read from your disk and scanned in your browser tab; the reader is plain TypeScript and nothing is transmitted. You can open the Network tab and confirm 0 bytes leave — useful when a "download all" bundle contains documents you would rather not hand to an unknown server.

Related: Repair a ZIP archive · "Unexpected end of archive" (ZIP/RAR/7z) · "Compressed folder is invalid" · Verify the zero-upload claim