为什么我将PDF格式的内容类型作为HTML返回?

Rus*_*ams 2 java url content-type web-crawler mime-types

我试图使用以下代码查看Web URL的内容类型.

有趣的是,给定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);
}
Run Code Online (Sandbox Code Playgroud)

dur*_*597 5

当我在Java中访问此页面时,如果我尝试实际加载页面,则会收到403 - Forbidden错误.这些错误页面是HTML页面,而不是pdf文件,因此这就是您获得所看到的内容类型的原因.

该网站可能正在检测您的浏览器或使用其他一些机制来阻止自动下载,这就是为什么它可以在Chrome,Firefox和IE中运行但不适用于Java.

您的代码可以使用不同的URL工作,例如https://partners.adobe.com/public/developer/en/xml/AdobeXMLFormsSamples.pdf.

对于此Web服务器,如果指定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");
Run Code Online (Sandbox Code Playgroud)

有关设置的详细信息,请参阅此答案User-Agent.但是,在执行此操作之前,您应该确保您没有以某种方式违反网站的服务条款.

通常,检查网站是否明确禁止应用程序下载其内容的方法是使用该http://example.com/robots.txt文件.在这种情况下,那将是http://www.jbssinc.com/robots.txt.在这种情况下,此文件不禁止机器人(您的程序)下载此特定文件,因此我认为您可以欺骗您的用户代理.在这种情况下,Java被阻止的事实更可能是用户错误.

进一步阅读:是否允许使用伪造的用户代理?