Search code examples
batch-filecurlcmd

Zip file downloaded via batch file/cmd is corrupted


curl -o ./Makent-files.zip "https://github.com/Mapagmataas/Makent/archive/refs/heads/files.zip" --ssl-no-revoke

downloaded zip file is corrupted


Solution

  • I would use the parameter "-L" / "--location" to instruct curl to follow the location. Example:

    $ curl -L -o ./Makent-files.zip "https://github.com/Mapagmataas/Makent/archive/refs/heads/files.zip"
    
    $ zipinfo Makent-files.zip 
    Archive:  Makent-files.zip
    Zip file size: 9948 bytes, number of entries: 2
    drwx---     0.0 fat        0 bx stor 21-Dec-29 11:20 Makent-files/
    -rw----     0.0 fat   105662 bx defN 21-Dec-29 11:20 Makent-files/Makent.ico
    2 files, 105662 bytes uncompressed, 9626 bytes compressed:  90.9%
    

    Excerpt from the curl manpage:

          -L, --location
                  (HTTP) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response code), this option will make curl redo the request on the new place. If used  together  with
                  -i,  --include  or -I, --head, headers from all requested pages will be shown. When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different host, it will not be able to in‐
                  tercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to follow by using the --max-redirs option.
    
                  When curl follows a redirect and if the request is a POST, it will send the following request with a GET if the HTTP response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request
                  using the same unmodified method.
    
                  You can tell curl to not change POST requests to GET after a 30x response by using the dedicated options for that: --post301, --post302 and --post303.
    
                  The method set with -X, --request overrides the method curl would otherwise select to use.
    
                  Example:
                   curl -L https://example.com
    

    Ref: https://curl.se/docs/manpage.html

    Broader explanation to extend the comment from @SomethingDark using an example

    # downloading the file without following the location - we are downloading a html file
    $ curl -o ./Makent-files-without-minusL.zip "https://github.com/Mapagmataas/Makent/archive/refs/heads/files.zip"  
    
    # downloading the file with following the location - we are downloading the zip file befind the location redirect.
    $ curl -L -o ./Makent-files-with-minusL.zip "https://github.com/Mapagmataas/Makent/archive/refs/heads/files.zip" 
    
    # one file on your disk is a zip file and the other one the html file
    $ file *
    Makent-files-with-minusL.zip:    Zip archive data, at least v1.0 to extract, compression method=store
    Makent-files-without-minusL.zip: HTML document, ASCII text, with no line terminators