Je dois télécharger un fichier et j'utilise ce code , qui est essentiellement un AsyncTask
destiné à mettre à jour une barre de progression. Mais, comme je ne sais pas quelle est la taille du fichier, j'ai dû utiliser la barre de progression du spinner. Alors, comment puis-je obtenir la taille du fichier avant de commencer à le télécharger afin de pouvoir utiliser une barre de progression normale?
vous pouvez obtenir un en-tête appelé Content-Length
forme l'objet de réponse HTTP que vous obtenez, cela vous donnera la longueur du fichier. vous devez cependant noter que certains serveurs ne renvoient pas ces informations, et la seule façon de connaître la taille réelle est de tout lire dans la réponse.
Exemple:
URL url = new URL("http://server.com/file.mp3");
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
int file_size = urlConnection.getContentLength();
vous pouvez généralement utiliser getContentLength , mais la meilleure chose est d'obtenir la longueur par vous-même (car elle peut contourner la valeur maximale de l'entier).
il suffit d'analyser vous-même la valeur de l'en-tête de la longueur du contenu. mieux l'analyser aussi longtemps.
exemple:
final URL uri=new URL(...);
URLConnection ucon;
try
{
ucon=uri.openConnection();
ucon.connect();
final String contentLengthStr=ucon.getHeaderField("content-length");
//...
}
catch(final IOException e1)
{
}
notez que je peux être n'importe quelle chaîne, utilisez donc try catch, et si c'est -1, vide ou null, cela signifie que vous ne pouvez pas connaître la taille du fichier car le serveur ne le permet pas.
EDIT: Voici un code plus mis à jour, en utilisant 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
}