Как загрузить файл с сервера и сохранить его в определенной папке на SD-карте в Android?

У меня есть одно требование в моем приложении для Android. Мне нужно загрузить и сохранить файл в определенной папке SD-карты программно. Я разработал исходный код, который

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);
    }

}

Теперь проблема в том, что в пути сохраняется только пустой файл с именем файла myclock_db.db. но мне нужно загрузить и сохранить содержимое файла в определенной папке. Пробовал несколько способов скачать файл, но не могу.


person kumar Sudheer    schedule 20.04.2013    source источник
comment
как я могу проверить в этом примере, что загрузка файла завершена на 100%   -  person Karan Mavadhiya    schedule 27.06.2013
comment
Поскольку ваш файл базы данных может иметь большой размер, я настоятельно рекомендую записывать файл фрагментами, а не добавлять весь поток в память и сразу записывать весь файл.   -  person MikeL    schedule 28.01.2015


Ответы (1)


Ваш URL загрузки не является ссылкой на какой-либо файл. Это каталог. Убедитесь, что это файл и существует. Также проверьте окно logcat на наличие журналов ошибок. Еще одно предложение: всегда лучше выполнять printStackTrace() в блоках catch вместо журналов. Это дает более подробное представление об ошибке.

Измените эту строку:

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

to:

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

Затем в блоке catch добавьте следующую строку:

e.printStackTrace();

Также в пути к каталогу должно быть что-то вроде этого:

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

вместо

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

Затем убедитесь, что вы получили разрешение на запись во внешнее хранилище в манифесте Android.

person shiladitya    schedule 20.04.2013
comment
Хорошо, как я могу отредактировать свой код .. не могли бы вы помочь мне, пожалуйста .. @shiladitya - person kumar Sudheer; 20.04.2013
comment
На самом деле файл, который я загружаю, представляет собой файл базы данных, который является файлом, но не расширением .db. Чтобы он загружался с сервера, я добавил расширение и получил загрузку. Теперь файл, который мы скачали, не доступен, так как у него есть расширение. нам нужно удалить расширение после загрузки или другим способом объявить тип mime для файла в webconfig, который не работает. Итак, подскажите, как удалить расширение после загрузки. Я обновил свой код для этого .. можете ли вы проверить один раз. - person kumar Sudheer; 20.04.2013
comment
кто-нибудь может сказать, что в приведенном выше примере, как я могу проверить, что файл успешно завершен на 100%... - person Karan Mavadhiya; 27.06.2013