But with https, is this unnecessary? Https encrypts any data with a key, so if something was altered during transfer, the decryption on the server would fail, right?
It's not uncommon for a file upload service to allow for an MD5 hash to be provided in a header. The hash is then recalculated after the transfer is complete and if it doesn't match, an error is returned to the client. S3 provides this kind of feature, for example.
This is not redundant, but the point isn't related to security. I think what you are missing is that the mechanisms you are talking about with regard to HTTPS are only relevant to the transferred data. There are many things that can go wrong that HTTPS will not prevent. Your assumption is a bit like thinking that if your code compiles that it must execute properly.
For example, let's say your client fails to read the full content of the file or there is some sort of corruption during reading from disk. A common issue is unwanted conversion of newlines from one OS standard to another e.g. bytes that look like \n are converted to \r\n in a binary file. The file on the server is corrupt. But, as far as the HTTPS transfer is concerned, the stream was delivered exactly as it was sent and there are no issues to detect. The file is not the same on the server as it is on the client, though.
In such cases the successful upload will hash to something other than what the client calculated. If the client provided a hash with their content, the server can inform the client that what was received doesn't match the client's expectation.