使用HTTP请求下载文件的一部分

时间:2013-07-14 21:16:53

标签: java urlconnection downloading downloading-website-files

我正在尝试下载PDF文件的一部分(仅用于测试“Range”标题)。我请求服务器获取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

先谢谢。

4 个答案:

答案 0 :(得分:10)

尝试更改以下内容:

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));

答案 1 :(得分:1)

如果服务器支持它(和HTTP 1.1服务器应该),那么只有你可以使用范围请求... 如果你要做的就是检查,那么只需发送一个HEAD请求而不是GET请求。相同的标题,相同的一切,只是" HEAD"而不是" GET"。如果您收到206回复,则表示支持Range,否则您将获得200回复​​。

答案 2 :(得分:-2)

您必须在 setRequestProperty

之前连接到网址

变化:

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

要:

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

答案 3 :(得分:-3)

我认为正确的标题是“内容范围”,而不是您正在使用的“范围”。