【问题标题】:Downloading a portion of a File using HTTP Requests使用 HTTP 请求下载文件的一部分
【发布时间】:2013-07-14 21:16:53
【问题描述】:

我正在尝试下载 PDF 文件的一部分(仅用于测试“范围”标题)。我向服务器请求了 Range 中的字节(0-24),但我仍然没有从内容中获取前 25 个字节(一部分),而是获取了完整长度的内容。此外,我得到的响应代码不是 206(部分内容),而是 200。

这是我的代码:

public static void main(String a[]) {
    try {
        URL url = new URL("http://download.oracle.com/otn-pub/java/jdk/7u21-b11/jdk-7u21-windows-x64.exe?AuthParam=1372502269_599691fc0025a1f2da7723b644f44ece");
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestProperty("Range", "Bytes=0-24");
        urlConnection.connect();

        System.out.println("Respnse Code: " + urlConnection.getResponseCode());
        System.out.println("Content-Length: " + urlConnection.getContentLengthLong());

        InputStream inputStream = urlConnection.getInputStream();
        long size = 0;

        while(inputStream.read() != -1 )
            size++;

        System.out.println("Downloaded Size: " + size);

    }catch(MalformedURLException mue) {
        mue.printStackTrace();
    }catch(IOException ioe) {
        ioe.printStackTrace();
    }
}

这是输出:
Respnse Code: 200
Content-Length: 94973848
Downloaded Size: 94973848

提前致谢。

【问题讨论】:

  • 你能验证一个可以下载范围的程序确实下载了一个范围吗? (尝试启动 wget,Ctrl+C'ing,然后重新启动)一些服务器可能会按原样拒绝请求。

标签: java urlconnection download downloading-website-files


【解决方案1】:

尝试更改以下内容:

urlConnection.setRequestProperty("Range", "Bytes=0-24");

与:

urlConnection.setRequestProperty("Range", "bytes=0-24");

按照规范14.35.1 Byte Ranges

同样,根据规范14.5 Accept-Ranges,您还可以使用以下方法检查您的服务器是否真的支持部分内容检索:

boolean support = urlConnection.getHeaderField("Accept-Ranges").equals("bytes");
System.out.println("Partial content retrieval support = " + (support ? "Yes" : "No));

【讨论】:

  • 不幸的是,有些服务器可能会正确响应 206 但根本没有 Accept-Ranges 标头。
【解决方案2】:

如果服务器支持它(HTTP 1.1 服务器应该支持),那么您只能使用范围请求... 如果您只想检查,那么只需发送 HEAD 请求而不是 GET 请求。相同的标题,相同的一切,只是“HEAD”而不是“GET”。如果您收到 206 响应,您将知道 Range 受支持,否则您将收到 200 响应。

【讨论】:

  • gstack,我发送了"HEAD"请求,得到的响应码为200。这一定意味着服务器不支持"Resuming"下载功能。然后,我想知道,我如何能够在其他下载管理器中“暂停”和“恢复”该文件的下载。另外,如果您能推荐任何内容部分可以通过此方法下载的 http 链接,那就太好了。
【解决方案3】:

您必须在 setRequestProperty

之前连接到 url

变化:

urlConnection.setRequestProperty("Range", "Bytes=0-24");
urlConnection.connect();

收件人:

urlConnection.connect();
urlConnection.setRequestProperty("Range", "Bytes=0-24");

【讨论】:

    【解决方案4】:

    我认为正确的标题是“Content-Range”,而不是您使用的“Range”。

    【讨论】:

    • gstack,用"Content-Range"也试过了;获取same output
    • 不,AFAIK。 content-range 是服务器响应的内容。满足您的要求。
    猜你喜欢
    • 2010-12-20
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2016-10-01
    相关资源
    最近更新 更多