Download binary file from Github using Java

后端 未结 5 1039
北海茫月
北海茫月 2021-01-05 11:12

I\'m trying to download this file (http://github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar) with the following method and it doesn\'t seem to work. I\'

相关标签:
5条回答
  • 2021-01-05 11:48

    Get the direct download link to the raw binary file e.g. https://github.com/xerial/sqlite-jdbc/blob/master/src/main/resources/org/sqlite/native/Windows/x86_64/sqlitejdbc.dll?raw=true by copying the View Raw link:

    Finally use the following piece of code to download the file:

    public static void download(String downloadURL) throws IOException
    {
        URL website = new URL(downloadURL);
        String fileName = getFileName(downloadURL);
    
        try (InputStream inputStream = website.openStream())
        {
            Files.copy(inputStream, Paths.get(fileName), StandardCopyOption.REPLACE_EXISTING);
        }
    }
    
    public static String getFileName(String downloadURL)
    {
        String baseName = FilenameUtils.getBaseName(downloadURL);
        String extension = FilenameUtils.getExtension(downloadURL);
        String fileName = baseName + "." + extension;
    
        int questionMarkIndex = fileName.indexOf("?");
        if (questionMarkIndex != -1)
        {
            fileName = fileName.substring(0, questionMarkIndex);
        }
    
        fileName = fileName.replaceAll("-", "");
        return URLDecoder.decode(fileName, "UTF-8");
    }
    

    You will also need the Apache Commons IO maven dependency for the FilenameUtils class:

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>LATEST</version>
    </dependency>
    
    0 讨论(0)
  • 2021-01-05 11:58

    I could make it work for link template in question

    http://github.com/downloads/Nodeclipse/eclipse-node-ide/CoffeeScriptSet.p2f

    Neither this

    http://cloud.github.com/downloads/Nodeclipse/eclipse-node-ide/CoffeeScriptSet.p2f

    However below is what worked for me

    https://raw.github.com/Nodeclipse/eclipse-node-ide/master/EclipseNodeIDE-0.2.p2f

    0 讨论(0)
  • 2021-01-05 12:04

    I've found the solution.

    Apparantly http://github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar doesn't link directly to my file.

    When viewing the resulting jar with an text editor I found this:

    <html><body>You are being <a href="http://cloud.github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar">redirected</a>.</body></html>
    

    So this means that the direct link is the following: http://cloud.github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar

    And with this link I can download the file with my method without any problems.

    0 讨论(0)
  • 2021-01-05 12:06

    This one do the work:

    public class Download {
       private static boolean isRedirected( Map<String, List<String>> header ) {
          for( String hv : header.get( null )) {
             if(   hv.contains( " 301 " )
                || hv.contains( " 302 " )) return true;
          }
          return false;
       }
       public static void main( String[] args ) throws Throwable
       {
          String link =
             "http://github.com/downloads/TheHolyWaffle/ChampionHelper/" +
             "ChampionHelper-4.jar";
          String            fileName = "ChampionHelper-4.jar";
          URL               url  = new URL( link );
          HttpURLConnection http = (HttpURLConnection)url.openConnection();
          Map< String, List< String >> header = http.getHeaderFields();
          while( isRedirected( header )) {
             link = header.get( "Location" ).get( 0 );
             url    = new URL( link );
             http   = (HttpURLConnection)url.openConnection();
             header = http.getHeaderFields();
          }
          InputStream  input  = http.getInputStream();
          byte[]       buffer = new byte[4096];
          int          n      = -1;
          OutputStream output = new FileOutputStream( new File( fileName ));
          while ((n = input.read(buffer)) != -1) {
             output.write( buffer, 0, n );
          }
          output.close();
       }
    }
    
    0 讨论(0)
  • 2021-01-05 12:13

    It looks like GitHub is giving you several levels of redirects when you request this file and this StackOverflow article states that URLConnection will not automatically follow redirects that change the protocol. Here is what I am seeing with curl:

    First Request:

    curl -v http://github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar
    * About to connect() to github.com port 80 (#0)
    *   Trying 207.97.227.239... connected
    * Connected to github.com (207.97.227.239) port 80 (#0)
    > GET /downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar HTTP/1.1
    > User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
    > Host: github.com
    > Accept: */*
    >  
    < HTTP/1.1 301 Moved Permanently 
    < Server: nginx < Date: Sun, 18 Nov 2012 15:56:36 GMT 
    < Content-Type: text/html < Content-Length: 178 
    < Connection: close 
    < Location: https://github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar 
    <  <html> <head><title>301 Moved Permanently</title></head> <body bgcolor="white"> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx</center> </body> </html>
    * Closing connection #0
    

    A curl of this location header:

    curl -v https://github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar
    * About to connect() to github.com port 443 (#0)
    *   Trying 207.97.227.239... connected
    * Connected to github.com (207.97.227.239) port 443 (#0)
    * SSLv3, TLS handshake, Client hello (1):
    * SSLv3, TLS handshake, Server hello (2):
    * SSLv3, TLS handshake, CERT (11):
    * SSLv3, TLS handshake, Server finished (14):
    * SSLv3, TLS handshake, Client key exchange (16):
    * SSLv3, TLS change cipher, Client hello (1):
    * SSLv3, TLS handshake, Finished (20):
    * SSLv3, TLS change cipher, Client hello (1):
    * SSLv3, TLS handshake, Finished (20):
    * SSL connection using RC4-SHA
    * Server certificate:
    *    subject: businessCategory=Private Organization; 1.3.6.1.4.1.311.60.2.1.3=US; 1.3.6.1.4.1.311.60.2.1.2=California; serialNumber=C3268102; C=US; ST=California; L=San Francisco; O=GitHub, Inc.; CN=github.com
    *    start date: 2011-05-27 00:00:00 GMT
    *    expire date: 2013-07-29 12:00:00 GMT
    *    subjectAltName: github.com matched
    *    issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=DigiCert High Assurance EV CA-1
    *    SSL certificate verify ok.
    > GET /downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar HTTP/1.1
    > User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
    > Host: github.com
    > Accept: */*
    > 
    < HTTP/1.1 302 Found
    < Server: nginx
    < Date: Sun, 18 Nov 2012 15:58:56 GMT
    < Content-Type: text/html; charset=utf-8
    < Connection: keep-alive
    < Status: 302 Found
    < Strict-Transport-Security: max-age=2592000
    < Cache-Control: no-cache
    < X-Runtime: 48
    < Location: http://cloud.github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar
    < X-Frame-Options: deny
    < Content-Length: 149
    < 
    * Connection #0 to host github.com left intact
    * Closing connection #0
    * SSLv3, TLS alert, Client hello (1):
    <html><body>You are being <a href="http://cloud.github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar">redirected</a>.</body></html>
    

    The location header in this response is returning the actual file. You may want to use Apache HTTP Client to download this. You can set it up to follow these 301 and 302 redirects during the GET.

    0 讨论(0)
提交回复
热议问题