Download a File with OkHttp

/download-a-file-with-okhttp

    • Je cherche une doc claire et bien faite, considérée comme fiable, pour savoir comment on fait, en Kotlin, pour télécharger un fichier sur le Web et le sauvegarder en local.

      Ça me semblait une question toute con, mais alors vraiment, je pars là-dedans sur Stack Overflow, et c’est proprement n’importe quoi.

    • A priori, en passant par Okhttp:

         fun downloadFileAsync(downloadUrl: String) {
             val client = OkHttpClient()
             val request = Request.Builder().url(https://seenthis.net/downloadUrl).build()

             client.newCall(request).enqueue(object : Callback {
                 override fun onFailure(call: Call, e: IOException) {
                     e.printStackTrace()
                 }
                 override fun onResponse(call: Call, response: Response) {
                     val fos = FileOutputStream("d:/tmp.txt")
                     fos.write(response.body?.bytes())
                     fos.close()
                 }
             })
         }

      Pour le téléchargement, ça je sais que ça fonctionne, je l’ai déjà utilisé pour récupérer un fichier JSON distant ; en revanche, la partie sauvegarde en local, pas encore testé.

      La page suivante donne aussi un exemple pour faire le téléchargement de manière synchrone (je ne sais pas dans quel cas ce serait utile, mais au cas où…) :
      https://howtoprogram.xyz/2016/11/17/download-a-file-with-okhttp

    • La doc officielle pour sauvegarder un fichier en local :
      https://developer.android.com/training/data-storage/files/internal

      Il y a même ce que je cherche : sauvegarder un fichier de cache (que le système peut effacer lui-même s’il manque de place) :

      // For a more secure solution, use EncryptedFile from the Security library
      // instead of File.
      private fun getTempFile(context: Context, url: String): File? =
             Uri.parse(url)?.lastPathSegment?.let { filename ->
                 File.createTempFile(filename, null, context.cacheDir)
             }

      Et après (un assez long moment) : non c’est pas vraiment utilisable en l’état (bon sang de doc de merde).