Мне нужно загрузить файл, и я использую этот код, который в основном представляет собой AsyncTask
, который предназначен для обновления прогресса бар. Но, так как я не знаю, какой размер файла я должен был использовать индикатор выполнения счетчика. Итак, как я могу получить размер файла, прежде чем загружать его, чтобы я мог использовать нормальный индикатор выполнения?
Как узнать размер файла перед его загрузкой?
Ответ 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
}