2016-02-28 90 views
1

我想为我的Minecraft-Mod编写自己的Mod安装程序。 有一个问题:我想使用GitHub发布来下载首选版本。

这里的链接(如:https://github.com/TheOnlySilverClaw/Reforged/releases/download/v0.6-alpha/reforged-0.6-alpha-1.8.jar)不是直接链接,所以我不能使用OutputStream直接从它们下载。

“直接”链接是这样的:https://github-cloud.s3.amazonaws.com/releases/48553472/d19e9d64-d436-11e5-802b-9cc751a6de68.jar?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAISTNZFOVBIJMK3TQ%2F20160228%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20160228T223303Z&X-Amz-Expires=300&X-Amz-Signature=664ca72a54472e2ef7c3e4c5a0e9e552607b010bdf43c83c967319eb0110dd1a&X-Amz-SignedHeaders=host&actor_id=12763829&response-content-disposition=attachment%3B%20filename%3Dreforged-0.6-alpha-1.8.9.jar&response-content-type=application%2Foctet-stream

有没有办法检索一个更简单的下载URL(必须是直接链接!)?
我不希望每个文件3次上传:实现这个没有太多的复杂性/GitHub发布:直接链接

回答

0
  1. Here is info如何通过任何HTTP客户端(curl,Java HTTP客户端等)下载单个文件。

  2. 另一种方法是使用一些云CI(例如travis-ci),从您的GitHub仓库获取源到云构建过程并在您需要的任何位置释放工件。

  3. 您还可以使用GitHub的REST API的get a single release asset

0

一种方法是离开下载部分到成熟的工具,使发布的URL的完整。例如,如果你做的是:curl -L -O https://github.com/TheOnlySilverClaw/Reforged/releases/download/v0.6-alpha/reforged-0.6-alpha-1.8.jar,那么cUrlcUrl将做权利东西,并下载所有重定向链接的最终JAR文件。

如果你自己做,你当然可以使用优秀的HTTP客户端库,如Apache HTTP client。但我建议你把它留给像cUrl这样的预处理工具。一旦它在本地下载,您可以随时在您的程序或安装程序中执行您需要的操作。

我强烈建议不要使用最终链接(您在问题中发布的AWS的长链接),因为它可能会在没有通知的情况下发生变化。发布JAR文件(https://github.com/TheOnlySilverClaw/Reforged/releases/download/v0.6-alpha/reforged-0.6-alpha-1.8.jar)的链接是官方界面,不太可能更改。

0

感谢您的帮助! 我发现了一个示例代码和修改它(抱歉,我不能说的来源,因为我不觉得它了...):

public void sample() throws IOException { 
    String link = 
      "https://github.com/TheOnlySilverClaw/Reforged/releases/download/v0.6-alpha/reforged-0.6-alpha-1.8.jar"; 
      String   fileName = "reforged-0.6-alpha-1.8.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("C:/Users/Nico/Desktop/" + fileName)); 
      while ((n = input.read(buffer)) != -1) { 
      output.write(buffer, 0, n); 
      } 
      output.close(); 
} 
    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; 
    } 

谢谢您的回答! ^^