BitTorrent and related protocols handle this automatically by breaking the file into large (megabyte-range) chunks, and then putting the cryptographic hashes of all the chunks in the manifest. As long as you've received the manifest, you can protect against both passive corruption and active MITMing in the same way you resume broken downloads: by just discarding chunks that failed to complete to a state of "has all the bytes and hashes correctly", and trying those chunks again.
(Sadly, HTTP doesn't support a digest response header that applies to each chunk of a "Transfer-Encoding: chunked" response stream, or it could vaguely compete with this. The Content-MD5 header could have done this, but it was removed precisely because implementations were in conflict on whether it was for this, or for hashing the document as a whole.)