Java URLConnection: как узнать размер веб-файла? - PullRequest
29 голосов
/ 04 ноября 2008

Я работаю над проектом для школы и внедряю инструмент, который можно использовать для загрузки файлов из Интернета (с возможностью регулирования). Дело в том, что у меня будет GUI для него, и я буду использовать JProgressBar виджет, который я хотел бы показать текущий прогресс загрузки. Для этого мне нужно знать размер файла. Как вы получаете размер файла до загрузки файла.

Ответы [ 6 ]

38 голосов
/ 04 ноября 2008

Любой HTTP-ответ должен содержать заголовок Content-Length, поэтому вы можете запросить объект URLConnection для этого значения.

//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...
       ...
    }

Сервер не всегда может вернуть точную длину содержимого, поэтому значение может быть неточным, но, по крайней мере, большую часть времени вы получите некоторое пригодное для использования значение.

обновление: Или, теперь, когда я более подробно рассмотрю Javadoc URLConnection, вы можете просто использовать метод getContentLength () .

33 голосов
/ 04 ноября 2008

Как уже упоминалось, getContentLengthLong() в URLConnection - ваша лучшая ставка, но она не всегда дает определенную длину. Это потому, что протокол HTTP (и другие, которые могут быть представлены URLConnection), не всегда передает длину.

В случае HTTP длина динамического содержимого обычно заранее неизвестна - когда обычно отправляется заголовок content-length. Вместо этого другой заголовок, transfer-encoding, указывает, что используется «чанкованная» кодировка. При кодировании по частям длина всего ответа не указывается, и ответ отправляется обратно по частям, где указывается размер каждого куска. На практике сервер буферизует вывод сервлета. Всякий раз, когда буфер заполняется, отправляется другой кусок. Используя этот механизм, HTTP может фактически начать потоковую передачу ответа бесконечной длины.

Если размер файла превышает 2 ГБ, его размер не может быть представлен как int, поэтому более старый метод getContentLength() в этом случае вернет -1.

28 голосов
/ 06 октября 2011

Используя запрос HEAD, я заставил свой веб-сервер ответить правильным полем длины содержимого, которое в противном случае было бы пустым. Я не знаю, работает ли это вообще, но в моем случае это делает:

    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();
        }
    }
4 голосов
/ 04 ноября 2008

Вы хотите использовать длину содержимого (URLConnection.getContentLength ()). К сожалению, это не всегда точно, или не всегда может быть предоставлено, поэтому не всегда безопасно полагаться на это.

1 голос
/ 23 июня 2016
    //URLConnection connection

private int FileSize(String url) {

 // this is the method and it get the url as a parameter.

       // this java class will allow us to get the size of the file.

        URLConnection con; 

         // its in a try and catch incase the url given is wrong or invalid

        try{ 

            // we open the stream

            con = new URL(url).openConnection()

            return con.getContentLength(); 
        }catch (Exception e){

            e.printStackTrace();

            // this is returned if the connection went invalid or failed.

            return 0; 
        }
    }
0 голосов
/ 02 февраля 2011

Как сказал @erickson, иногда есть заголовок "Transfer-Encoding: chunked" вместо "Content-Length:" и, конечно, у вас есть нулевое значение для длины.

О методе available () - никто не может гарантировать вам, что он вернет правильное значение, поэтому я рекомендую вам не использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...