2016-02-28 87 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; 
    } 

謝謝您的回答! ^^