web-dev-qa-db-fra.com

Comment connaître la taille d'un fichier avant de le télécharger?

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?

34
Cristian

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();
73
reflog

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
}
17
android developer