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

2023-11-22

我正在尝试下载此文件(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 来实现此目的,但得到了相同的效果,一个空/损坏的文件。


当您请求此文件时,GitHub 似乎为您提供了多个级别的重定向,并且这篇 StackOverflow 文章声明 URLConnection 不会自动遵循更改协议的重定向。这是我在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

该位置标头的卷曲:

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>

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Java 从 Github 下载二进制文件 的相关文章

随机推荐

  • VBA如何在子程序之间使用变量?

    我对 VBA 很陌生 我不知道如何在子程序之间使用变量 该代码应该非常不言自明 Public Sub Worksheet SelectionChange ByVal Target As Range Dim strWeapon As Stri
  • 如何从 Node.js http get 请求中获取数据

    我试图让我的函数返回 http get 请求 但是 无论我做什么 它似乎都会迷失在 范围 中 我对 Node js 很陌生 所以任何帮助将不胜感激 function getData var http require http var str
  • History.pushState(data,title,url) 如果有尾部斜杠,则将 url 连接(而不是替换)到地址栏

    例如 如果我使用 www site com 中的搜索栏 我会看到 www site com search 这很好 如果我使用 www site com events 中的搜索栏 我会看到 www site com events search
  • Castle Windsor:如何以编程方式将列表参数传递给容器?

    解析类型时是否可以传递列表构造函数参数 如果可能的话 我想使用编程配置 我一直在尝试使用如下所示的参数方法 但我还没有偶然发现答案 container Register Component For
  • 无法启动 iOS 8 模拟器

    我刚刚从 Mac App Store 将 Xcode 更新到 6 0 1 我的操作系统版本是 OS X 10 9 5 问题是 iOS 8 模拟器无法加载 但 iOS 7 模拟器工作正常 每次我尝试启动 iOS 8 模拟器设备时 都会收到一条
  • add_lvalue_reference_t 和 T& 之间的区别

    假设你有一个模板参数T 两者有什么区别 add cv t
  • OpenCV (Emgu.CV)——使用 alpha 合成图像

    我正在使用 Emgu CV 执行一些基本的图像处理和合成 我的图像加载为Image
  • 获取 foreach 循环中的下一个元素

    我有一个 foreach 循环 我想查看循环中是否有下一个元素 以便我可以将当 前元素与下一个元素进行比较 我怎样才能做到这一点 我已阅读有关当前和下一个功能的信息 但我不知道如何使用它们 一种独特的方法是反转数组并then环形 这也适用于
  • TRestClient/TRestRequest 错误地解码 gzip 响应

    我尝试读取 REST API 它是 gzip 编码的 确切地说 我尝试阅读 StackExchange API 我已经找到问题了自动解码 TRESTResponse 中的 GZIP 但由于某种原因 这个答案并不能解决我的问题 测试设置 在X
  • 即使已处理异常,在 VS2010 调试器中也会出现未处理的异常

    我在使用 VS2010 时遇到一个问题 调试器因未处理的异常而停止 不过 异常肯定是得到处理的 事实上 如果我将代码放入 catch 块中 当我按 F5 时就会命中它 在 调试 gt 异常 中 我肯定会这样做not选中 抛出 复选框 因此
  • 挥发性与原子性[重复]

    这个问题在这里已经有答案了 我在下面的某处读到 Java volatile 关键字并不意味着原子 这是它的常见误解 声明 volatile 后 操作将是原子的 以使 您仍然需要使用原子操作来确保独占访问synchronizedJava 中的
  • WCF平台是否独立?

    我只需要知道 WCF 是否像 Webservices 一样与平台无关 Java和Php可以访问WCF中的函数吗 Thanks 是的 当然 WCF 本身只能在 Windows 上运行 但它提供的服务可以从任何其他语言 工具访问 使用 WCF
  • 我可以在基类中重载纯虚方法吗?

    在下面的示例中 我有一个带有纯虚方法 又名 FUN1 和普通方法 又名 FUN2 的抽象类 include
  • 使用返回 impl 特征的泛型函数“借用的值寿命不够长”

    我从这个 Rust 代码中得到一个意外的错误 struct Container lt a gt x a i32 trait Reply impl Reply for i32 fn json
  • For 循环内的 Postgresql 更新

    我对 postgresql 还很陌生 并且在使用 for 循环更新表中的空值列时遇到问题 我正在处理的表格很大 因此为了简洁起见 我将给出一个较小的示例来说明要点 采取下表 id A B C a 1 0 NULL b 1 1 NULL c
  • 如何刷新列表框的数据源

    表单有1个Combobox和1个ListBox 单击 添加 按钮时 我想将组合框中的所选项目添加到列表框中 public partial class MyForm Form List
  • 关闭电脑

    有没有办法使用内置的 Java 方法关闭计算机 创建您自己的函数以通过以下方式执行操作系统命令命令行 举个例子 但正如其他人指出的那样 知道您想要在何处以及为何使用它 public static void main String arg t
  • 如何在 Spring 控制器中检索 FORM/POST 参数?

    我有以下回应 应该来自邮件黑猩猩网络钩子 URL 这是行正文 RAW BODY type usub fired at 2015 07 23 17 3A19 3A34 data 5Baction 5D unsub data 5Breason
  • 禁用 PHPhotoLibrary 中删除请求的确认

    我想做的是将视频保存到 PHPhotoLibrary 然后在应用程序中上传到客户端远程服务器完成时删除它们 基本上 照片库充当临时存储 以添加额外的安全层 以防万一发生任何故障 我已经将我的视频保存在应用程序目录中 Problem 问题是要
  • 使用 Java 从 Github 下载二进制文件

    我正在尝试下载此文件 http github com downloads TheHolyWaffle ChampionHelper ChampionHelper 4 jar 用下面的方法 它似乎不起作用 我收到一个空 损坏的文件 Strin