2016-03-14 8 views
3

Я использую FileUtils.copyURLToFile(URL, File), a Apache Commons IO 2.4 часть, чтобы загрузить и сохранить файл на моем компьютере. Проблема в том, что некоторые сайты отказывают в соединении без данных реферера и агента пользователя.Как указать User Agent и Referer в методе FileUtils.copyURLToFile (URL, File)?

Моих вопросы:

  1. Есть ли способ указать агент пользователя и ссылающийся на метод copyURLToFile?
  2. Или я должен использовать другой подход для загрузки файла, а затем сохранить заданный InputStream в файл?

ответ

3

Я повторно реализую функциональность с HttpComponents вместо Commons-IO. Этот код позволяет загружать файл на Java в соответствии с его URL-адресом и сохранять его в определенном месте.

Окончательный код:

public static boolean saveFile(URL imgURL, String imgSavePath) { 

    boolean isSucceed = true; 

    CloseableHttpClient httpClient = HttpClients.createDefault(); 

    HttpGet httpGet = new HttpGet(imgURL.toString()); 
    httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.11 Safari/537.36"); 
    httpGet.addHeader("Referer", "https://www.google.com"); 

    try { 
     CloseableHttpResponse httpResponse = httpClient.execute(httpGet); 
     HttpEntity imageEntity = httpResponse.getEntity(); 

     if (imageEntity != null) { 
      FileUtils.copyInputStreamToFile(imageEntity.getContent(), new File(imgSavePath)); 
     } 

    } catch (IOException e) { 
     isSucceed = false; 
    } 

    httpGet.releaseConnection(); 

    return isSucceed; 
} 

Конечно, приведенный выше код занимает больше места, то только одну строку кода:

FileUtils.copyURLToFile(imgURL, new File(imgSavePath), 
         URLS_FETCH_TIMEOUT, URLS_FETCH_TIMEOUT); 

, но это даст вам больший контроль над процессом и позволяют указывать не только тайм-ауты, но и User-Agent и Referer значения, которые имеют решающее значение для многих веб-сайтов.

0

Возможно, нет, если только вы не можете уловить основной механизм, который открывает URL-адрес.

Я рекомендую использовать библиотеку https://hc.apache.org/. У этого есть много особенностей относительно заголовков и т. Д.

+0

Я уже использую 'Apache HttpComponents', но не знаю, как объединить функции' copyURLToFile' и 'HttpComponents'. –

+0

вы не используете copyToUrl, вы можете использовать пакет https nio и использовать канал файла для записи данных в файл – GerritCap

 Смежные вопросы

  • Нет связанных вопросов^_^