Подтвердить что ты не робот

Как узнать размер файла перед его загрузкой?

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

4b9b3361

Ответ 1

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

Пример:

URL url = new URL("http://server.com/file.mp3");
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
int file_size = urlConnection.getContentLength();

Ответ 2

обычно вы можете использовать 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
}