Как узнать размер файла перед его загрузкой? - PullRequest
32 голосов
/ 06 июня 2010

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

Ответы [ 2 ]

73 голосов
/ 06 июня 2010

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

Пример:

URL url = new URL("http://server.com/file.mp3");
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
int file_size = urlConnection.getContentLength();
17 голосов
/ 05 сентября 2012

обычно вы можете использовать getContentLength , но лучше всего - получить длину самостоятельно (поскольку она может обойти максимальное значение целого числа).

просто проанализируйте значение заголовка content-length самостоятельно. лучше разбери как долго.

пример:

final URL uri=new URL(...);
URLConnection ucon;
try
  {
  ucon=uri.openConnection();
  ucon.connect();
  final String contentLengthStr=ucon.getHeaderField("content-length");
  //...
  }
catch(final IOException e1)
  {
  }

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

РЕДАКТИРОВАТЬ: Вот более обновленный код, используя Kotlin:

@JvmStatic
@WorkerThread
fun getFileSizeOfUrl(url: String): Long {
    var urlConnection: URLConnection? = null
    try {
        val uri = URL(url)
        urlConnection = uri.openConnection()
        urlConnection!!.connect()
        if (VERSION.SDK_INT >= Build.VERSION_CODES.N)
            return urlConnection.contentLengthLong
        val contentLengthStr = urlConnection.getHeaderField("content-length")
        return if (contentLengthStr.isNullOrEmpty()) -1 else contentLengthStr.toLong()
    } catch (ignored: Exception) {
    } finally {
        if (urlConnection is HttpURLConnection)
            urlConnection.disconnect()
    }
    return -1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...