Загрузить архив из репозитория

#java #download #web-scraping #wget #sourceforge

#java #Скачать #очистка веб-страниц #wget #sourceforge

Вопрос:

В настоящее время я работаю над проектом по извлечению исходного кода из SourceForge. Я хотел бы загрузить архив из репозитория кода.

Пример ссылки приведен ниже:http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar

Проблемы, с которыми я столкнулся при загрузке, заключаются в том, что я не могу использовать обычные API URLConnection, HttpClient, HtmlUnit, Jsoup и т.д. Для загрузки файла. Указанная ссылка не содержит никакого имени файла или расширения, это еще больше усложняет процесс загрузки.

Можете ли вы предложить средство, с помощью которого, учитывая набор ссылок на архив в качестве параметров, я смогу загрузить их на свой диск? Кроме того, я смог загрузить его с помощью wget. Есть ли способ, которым я могу программно сделать это на Java в Windows?

Комментарии:

1. Почему вы не можете использовать стандартную библиотеку Java для загрузки файла? Что касается имени файла, просто дайте ему случайное имя и .tar расширение. Вы можете создать случайное имя файла с помощью этого: Long.toHexString(Double.doubleToLongBits(Math.random())); ( исходный код).

2. Ознакомьтесь также с этими условиями использования .

3. Можете ли вы указать, почему вы не можете использовать «обычный URL, http, htmlunit, API jsoup и т.д.» Для загрузки файла? Совместное использование кода, который завершается ошибкой, поможет любому лучше понять вашу проблему.

4. Кстати, имя файла присутствует в заголовке Content-Disposition ответа (для предоставленной ссылки). Вам нужно проанализировать этот заголовок, чтобы получить желаемое имя файла (которое также отображается браузером в диалоговом окне сохранения файла).

Ответ №1:

Прежде чем вы продолжите свои усилия, внимательно прочитайте страницу Условий использования Sourceforge. Если вы не понимаете ToS, свяжитесь с Sourceforge и спросите их, разрешено ли вам делать то, что вы предлагаете.


Проблемы, с которыми я столкнулся при загрузке, заключаются в том, что я не могу использовать обычные URL, http, htmlunit, jsoup API и т.д. Для загрузки файла.

Ваше предположение неверно.

Для выполнения подобных задач вы можете использовать API, такие как стандартный HttpURLConnection API или Apache HttpClient APIs. Если он не работает, это потому, что

  • вы делаете что-то неправильно (например, вы не настроили свое Java-приложение на использование вашего локального HTTP-прокси), или
  • Sourceforge использует некоторые технические средства, чтобы помешать вам делать это; смотрите ToS.

Если вы опубликуете некоторые подробности о том, что происходит, когда вы пробуете эти подходы, возможно, мы сможем вам помочь.

(HtmlUnit и Jsoup, вероятно, неуместны, поскольку они предназначены для содержимого HTML.)

Указанная ссылка не содержит никакого имени файла или расширения, это еще больше усложняет процесс загрузки.

Вы можете получить исходное имя файла и / или тип содержимого из заголовков ответа. Обратитесь к спецификациям HTTP для получения подробной информации.

Ответ №2:

В случае, если вы действительно хотите, возможно, нарушить ToS SourceForges, это может помочь.

Вам нужно wget.exe , как вы и хотели.

 ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy");
Process p = pb.start();
  

Это будет работать до тех пор, пока у вас есть wget.exe в том же каталоге, что и файл класса.

Вы также можете захотеть проверить, существует ли файл, и в этом случае вам следует сделать что-нибудь из следующих строк:

 ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy");
       Process p = pb.start();
       int exitValue = p.waitFor();
       BufferedReader reader;
       // System.out.println("Exit Value"   exitValue);
       if (exitValue == 0) {
               reader = new BufferedReader(new InputStreamReader(p
                               .getInputStream()));
       } else {
               reader = new BufferedReader(new InputStreamReader(p
                               .getErrorStream()));
       }
       StringBuffer sb = new StringBuffer();
       String temp = reader.readLine();
       while (temp != null) {
               sb.append(temp);
               temp = reader.readLine();
       }

       reader.close();
       System.out.println(sb.toString());
if(sb.toString().indexOf("404") != -1) {
//means that the file does not exist
System.out.println("File does not exist, or access is denied");
} else {
if(sb.toString().indexOf("200") != -1) {
//file exists, download it
System.out.println("File exists, downloading...");
ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy");
    Process p = pb.start();
}
  

Но я рекомендую НЕ очищать SourceForge, если только вы не очищаете свой собственный код (я сделал это однажды в качестве программы обновления). Если вы это сделаете, и мой пример поможет, пожалуйста, не упоминайте меня. =]

Надеюсь, я помог!