Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java URLConnection : how can I find out the size of a web file?

I'm working on a project for school, and I'm implementing a tool which can be used to download files from the web ( with a throttling option ). The thing is, I'm gonna have a GUI for it, and I will be using a JProgressBar widget, which I would like to show the current progress of the download. For that I would need to know the size of the file. How do you get the size of the file prior to downloading the file.

like image 375
Geo Avatar asked Nov 04 '08 19:11

Geo


People also ask

How to get size of a file from URL Java?

To get the size of file from server first you need to connect to the server using URL and HttpURLConnection Class. To get the size of file we use getContentLength() method. As the size of file can be too large we use BigInteger class.

How to get file size in Java?

Java get file size using File classJava File length() method returns the file size in bytes. The return value is unspecified if this file denotes a directory. So before calling this method to get file size in java, make sure file exists and it's not a directory.

How do I find the content length of a URL?

Once the URL connection has been opened, you can try something like this: List values = urlConnection. getHeaderFields(). get("content-Length") if (values !=

What is URL and URLConnection in Java?

The Java URLConnection class represents a communication link between the URL and the application. It can be used to read and write data to the specified resource referred by the URL.


4 Answers

Any HTTP response is supposed to contain a Content-Length header, so you could query the URLConnection object for this value.

//once the connection has been opened List values = urlConnection.getHeaderFields().get("content-Length") if (values != null && !values.isEmpty()) {      // getHeaderFields() returns a Map with key=(String) header      // name, value = List of String values for that header field.      // just use the first value here.     String sLength = (String) values.get(0);      if (sLength != null) {        //parse the length into an integer...        ...     } 

It might not always be possible for a server to return an accurate Content-Length, so the value could be inaccurate, but at least you would get some usable value most of the time.

update: Or, now that I look at the URLConnection javadoc more completely, you could just use the getContentLength() method.

like image 66
matt b Avatar answered Oct 05 '22 20:10

matt b


As mentioned, URLConnection's getContentLengthLong() is your best bet, but it won't always give a definite length. That's because the HTTP protocol (and others that could be represented by a URLConnection) doesn't always convey the length.

In the case of HTTP, the length of dynamic content typically isn't known in advance—when the content-length header would normally be sent. Instead, another header, transfer-encoding, specifies that a "chunked" encoding is used. With chunked encoding, the length of the entire response is unspecified, and the response is sent back in pieces, where the size of each piece is specified. In practice, the server buffers output from the servlet. Whenever the buffer fills up, another chunk is sent. Using this mechanism, HTTP could actually start streaming a response of infinite length.

If a file is larger than 2 Gb, its size can't be represented as an int, so the older method, getContentLength() will return -1 in that case.

like image 45
erickson Avatar answered Oct 05 '22 19:10

erickson


Using a HEAD request, i got my webserver to reply with the correct content-length field which otherwise was empty. I don't know if this works in general but in my case it does:

    private int tryGetFileSize(URL url) {
        HttpURLConnection conn = null;
        try {
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("HEAD");
            conn.getInputStream();
            return conn.getContentLength();
        } catch (IOException e) {
            return -1;
        } finally {
            conn.disconnect();
        }
    }
like image 43
betty Avatar answered Oct 05 '22 20:10

betty


You'll want to use the content length (URLConnection.getContentLength()). Unfortunately, this won't always be accurate, or may not always be provided, so it's not always safe to rely on it.

like image 21
Herms Avatar answered Oct 05 '22 19:10

Herms