2015-09-01 1 views
2

Я пытаюсь увидеть тип контента веб-URL, используя следующий код.Почему я получаю тип содержимого PDF-файла, который возвращается как HTML?

Интересно, что тип содержимого данного URL-адреса (http://www.jbssinc.com/inv_pr_pdf/2007-05-08.pdf") возвращается как text/html; charset=iso-8859-1, хотя это документ PDF. Я хотел бы понять, почему.

Вот мой код:

public static void main(String[] args) throws MalformedURLException{ 
    URLConnection urlConnection = null; 
    URL url = new URL("http://www.jbssinc.com/inv_pr_pdf/2007-05-08.pdf"); 
    try { 
     urlConnection = url.openConnection(); 
     urlConnection.setConnectTimeout(10*1000); 
     urlConnection.setReadTimeout(10*1000); 
     urlConnection.connect(); 

    } catch (IOException e) { 
     System.out.println("Error in establishing connection.\n"); 
    } 
    String contentType = ""; 
    /* If we were able to get a connection ---> */ 
    if (urlConnection != null) { 
     contentType = urlConnection.getContentType(); 
    } 
    System.out.println(contentType); 
} 
+0

поговорить с кем бы создать этот сайт. это не имеет никакого отношения к вашему коду. и только потому, что URL-адрес заканчивается на '.pdf', это не значит, что сайт должен действительно обрабатывать данные в формате pdf. что вполне может быть html-страницей с «пожалуйста, войдите в систему, чтобы просмотреть файл» или что-то еще. –

+0

@dsh, кто-либо предоставляет тип контента или это то, что автоматически обнаруживается сервером? –

+0

Я только что отправил запрос (используя Firefox) на этот URL-адрес и ответил «Content-Type: application/pdf». – dsh

ответ

4

Когда доступ к этой странице в Java, если я пытаюсь фактически загрузить страницу, я получаю 403 а - Запретный ошибки. Эти страницы ошибок являются страницами HTML, а не файлами PDF, поэтому вы получаете тип контента, который видите.

Этот сайт, вероятно, обнаруживает ваш браузер или использует какой-либо другой механизм для предотвращения автоматической загрузки, поэтому он работает в Chrome, Firefox и IE, но не с Java.

Ваш код работает отлично с другим URL-адресом, например https://partners.adobe.com/public/developer/en/xml/AdobeXMLFormsSamples.pdf.

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

Попробуйте добавить эту строку непосредственно перед urlConnection.connect():

urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); 

See this answer for more information about setting the User-Agent. Вы должны убедиться, что вы не нарушаете Условия обслуживания сайта каким-то образом, прежде чем делать это.

Как правило, для проверки того, запрещает ли сайт запрещать загрузку содержимого приложениями, является файл http://example.com/robots.txt. В этом случае это будет http://www.jbssinc.com/robots.txt. В этом случае этот файл не запрещает загрузке этого файла роботам (вашей программе), поэтому я думаю, что вы можете обмануть своего User Agent. В этом случае вероятность блокировки Java скорее всего будет ошибкой пользователя.

Дальнейшее чтение: Is using a faked user agent allowed?

+0

Спасибо за ваш ответ. Как я узнаю, что, установив User-Agent, я не нарушаю TOS веб-сайта. Где мне его найти? –

+0

Это хорошо @ durron597, и я действительно подчиняюсь robots.txt. Как насчет спуфинга User-Agent? Знаете ли вы какие-либо последствия в отношении этого подмены? Я знаю, что это напрямую не связано с моим вопросом, размещенным здесь, но это так косвенно. –

+0

@ RushdiShams [IANAL] (https://en.wikipedia.org/wiki/IANAL), технология - это мой опыт, а не закон. Однако вы можете найти это полезным: [Используется ли поддельный пользовательский агент?] (Http://stackoverflow.com/q/20926097/1768232) – durron597