【问题标题】:Java: File type of `url.openStream()`Java:`url.openStream()`的文件类型
【发布时间】:2011-04-27 15:05:07
【问题描述】:

我写了这个方法来下载一个给定 URL 的网页。它旨在仅下载 HTML。如果我想做错误检查并只允许 HTML,我应该怎么做?

public static String download(URL url) throws IOException {
    InputStream is = url.openStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    String page = "";
    String line;    
    while((line = reader.readLine()) != null){
        page = page + line;
    }
    return page;
}

原本我打算这样做:

String file = url.getFile();
if(file.subString(file.indexOf("."),file.length()-1).equalsIgnoreCase("HTML")){
    // do method

但是 URL:http://www.smu.comurl.getFile() 返回 ""。有人有什么建议吗?

【问题讨论】:

    标签: java file url stream


    【解决方案1】:

    “http://www.smu.com”向您发送“http://www.smu.com/index.html”中的数据。这是请求“/”时网络服务器的(常见)行为(网络服务器理论上也可以使用 302 或诸如此类的方式重定向)。因此,检查 URL 是否以“.html”结尾是完全愚蠢的(更不用说它可能是“.php”、“.asp”或其他)。

    但是,nice 提供 HTML 的网络服务器应该返回“text/html”的Content-Type 标头。 (这当然是假设它返回的是 HTML 而不是 XHTML 或 XML 或诸如此类的东西,并且网络服务器没有损坏)。

    您可能希望使用URLConnection。这是example of URLConnection with headers

    我是如何确定最高位的?

    我运行curl -I @987654323@(并使用../index.html)并比较了结果。它们看起来像:

    HTTP/1.1 200 OK
    Date: Tue, 19 Oct 2010 18:01:39 GMT
    Server: Apache
    Last-Modified: Wed, 27 Jan 2010 20:27:52 GMT
    Accept-Ranges: bytes
    Content-Length: 2993
    Content-Type: text/html
    

    【讨论】:

      【解决方案2】:

      如果您想检查内容超出检查 Content-Type 标头,那么您可以使用 HTML 解析器,例如(误导性命名!)JTidy

      【讨论】:

        【解决方案3】:

        要测试您是否正在获取 html,您可以使用 URL.openConnection() 来获取 UrlConnection,然后可以调用 getContentType(),它应该为 HTML 页面返回“text/html”。然后,您可以使用 UrlConnection() 上的 getInputStream() 方法代替 url.openStream();

        如果你真的想验证服务器发送给你的内容是 HTML,你需要找到一个 HTML 验证库。我不知道一个副手,对不起。

        有一点需要考虑,这可能就是 www.smu.com 不返回数据的原因,许多网站会根据 HTTP 连接上发送的 User-Agent 字符串提供不同的数据。您可能需要在 UrlConnection 上修改它: UrlConnection.addRequestProperty("User-Agent", ...);在这里查看更多信息:Setting user agent of a java URLConnection

        【讨论】:

        • smu.com 确实返回数据,URL 只是没有文件部分(斜杠之后)
        • @Bart 请求尝试获取网络服务器高兴地返回“/index.html”的“/”(这取决于网络服务器和此类配置 - 它可能只是高兴地返回了 404,但这对网络用户不友好)。它没有解释“无数据”,但确实解释了为什么您不需要“完整路径”。有关更多信息,请参阅我的答案(尽管已经接受此答案)。
        • @pst:我知道,我是这么说的,但你说得好多了
        猜你喜欢
        • 2020-07-01
        • 2014-03-03
        • 2012-06-15
        • 2016-08-31
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        相关资源
        最近更新 更多