web-dev-qa-db-fra.com

Comment télécharger un fichier depuis un serveur et l'enregistrer dans un dossier spécifique sur la carte SD sous Android?

J'ai une exigence dans mon Android. Je dois télécharger et enregistrer le fichier dans un dossier spécifique de la carte SD par programmation. J'ai développé le code source, qui est

String DownloadUrl = "http://myexample.com/Android/";
     String fileName = "myclock_db.db";

    DownloadDatabase(DownloadUrl,fileName);

    // and the method is

public void DownloadDatabase(String DownloadUrl, String fileName) {
    try {
        File root = Android.os.Environment.getExternalStorageDirectory();
        File dir = new File(root.getAbsolutePath() + "/myclock/databases");
        if(dir.exists() == false){
             dir.mkdirs();  
        }

        URL url = new URL("http://myexample.com/Android/");
        File file = new File(dir,fileName);

        long startTime = System.currentTimeMillis();
        Log.d("DownloadManager" , "download url:" +url);
        Log.d("DownloadManager" , "download file name:" + fileName);

        URLConnection uconn = url.openConnection();
        uconn.setReadTimeout(TIMEOUT_CONNECTION);
        uconn.setConnectTimeout(TIMEOUT_SOCKET);

        InputStream is = uconn.getInputStream();
        BufferedInputStream bufferinstream = new BufferedInputStream(is);

        ByteArrayBuffer baf = new ByteArrayBuffer(5000);
        int current = 0;
        while((current = bufferinstream.read()) != -1){
            baf.append((byte) current);
        }

        FileOutputStream fos = new FileOutputStream( file);
        fos.write(baf.toByteArray());
        fos.flush();
        fos.close();
        Log.d("DownloadManager" , "download ready in" + ((System.currentTimeMillis() - startTime)/1000) + "sec");
        int dotindex = fileName.lastIndexOf('.');
        if(dotindex>=0){
            fileName = fileName.substring(0,dotindex);

    }
    catch(IOException e) {
        Log.d("DownloadManager" , "Error:" + e);
    }

}

Maintenant, le problème est uniquement le fichier vide avec le nom de fichier myclock_db.db est enregistré dans le chemin. mais je dois télécharger et enregistrer le contenu du fichier dans le dossier spécifique. J'ai essayé plusieurs façons d'obtenir le téléchargement du fichier, mais je ne peux pas.

24
kumar Sudheer

Votre URL de téléchargement n'est pas un lien vers un fichier. C'est un répertoire. Assurez-vous que c'est un fichier et qu'il existe. Vérifiez également votre fenêtre logcat pour les journaux d'erreurs. Une autre suggestion, il est toujours préférable de faire un printStackTrace () dans des blocs catch au lieu de Logs. Cela donne une vue plus détaillée de l'erreur.

Modifiez cette ligne:

    URL url = new URL("http://myexample.com/Android/");

à:

    URL url = new URL("http://myexample.com/Android/yourfilename.txt"); //some file url

Ensuite, dans le bloc catch, ajoutez cette ligne:

e.printStackTrace();

Toujours dans le chemin du répertoire, cela devrait ressembler à ceci:

File dir = new File(root.getAbsolutePath() + "/mnt/sdcard/myclock/databases");

au lieu de

File dir = new File(root.getAbsolutePath() + "/myclock/databases");

Ensuite, assurez-vous que vous avez obtenu l'autorisation d'écrire sur le stockage externe dans le manifeste Android.

15
shiladitya