java - 使用 Java 从 Github 下载二进制文件

标签 java github download binary urlconnection

我正在尝试使用以下方法下载此文件 ( http://github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar),但它似乎不起作用。我得到一个空的/损坏的文件。

String link = "http://github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar";
String fileName = "ChampionHelper-4.jar";

URL url = new URL(link);
URLConnection c = url.openConnection();
c.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 1.2.30703)");

InputStream input;
input = c.getInputStream();
byte[] buffer = new byte[4096];
int n = -1;

OutputStream output = new FileOutputStream(new File(fileName));
while ((n = input.read(buffer)) != -1) {
    if (n > 0) {
        output.write(buffer, 0, n);
    }
}
output.close();

但我可以使用相同的方法从我的保管箱 ( http://dl.dropbox.com/u/13226123/ChampionHelper-4.jar ) 成功下载以下文件。

所以 Github 以某种方式知道我不是尝试下载文件的普通用户。我已经尝试更改用户代理,但这也无济于事。

那么我应该如何使用 Java 下载托管在我的 Github 帐户上的文件?

编辑:我尝试为此使用 apache commons-io,但我得到了相同的效果,一个空的/损坏的文件。

最佳答案

当您请求此文件和 this StackOverflow article 时,GitHub 似乎为您提供了多个级别的重定向声明 URLConnection 不会自动遵循更改协议(protocol)的重定向。这是我在 curl 中看到的:

第一个请求:

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

此位置 header 的 curl :

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>

此响应中的位置 header 返回实际文件。您可能想使用 Apache HTTP Client 来下载它。您可以将其设置为在 GET 期间遵循这些 301 和 302 重定向。

关于java - 使用 Java 从 Github 下载二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13441720/

相关文章:

java - Java中的按位右移运算符

java - 延迟影响整个区 block

java - Apache CXF 身份验证 + Spring Security

Java设计/实现问题

python - 如何将游戏数据导出到MySQL?

c# - 从网站下载音频文件

git - github 上 fork 存储库的更新

button - Github 桌面窗口同步按钮消失,历史选项卡不工作

javascript - gulp gh-pages 不工作

php - 在 PHP 中提供数字产品下载的最佳方式是什么?