2013-04-20 15 views
23

Mam jedno wymaganie w mojej aplikacji na Androida. Muszę programowo pobrać i zapisać plik w określonym folderze sdcard. Mam opracowane kodu źródłowego ..Android: jak pobrać plik z serwera i zapisać go w określonym folderze w sdcard

i mój kod jest

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

} 

Teraz problem jest tylko pusty plik z nazwą pliku myclock_db.db oszczędza na ścieżce. ale muszę pobrać i zapisać zawartość pliku w określonym folderze. Próbowałem pobrać kilka plików, ale nie mogę. Czy ktoś może mi pomóc rozwiązać ten problem ...

góry dziękuję ...

+0

Jak mogę sprawdzić w tym przykładzie, że plik Pobierz Zakończony 100% –

+0

Ponieważ plik db może mieć duży rozmiar, zdecydowanie zalecam zapisanie pliku w porcjach zamiast dołączania całego strumienia do pamięci i zapisania całego pliku pod adresem pewnego razu. – MikeL

Odpowiedz

13

Pobieranie adresu URL nie jest link do dowolnego pliku. To katalog. Upewnij się, że jest plik i istnieje. Sprawdź także okno logcat w poszukiwaniu dzienników błędów. Jeszcze jedna sugestia, zawsze lepiej jest zrobić printStackTrace() w blokach catch zamiast Logs. Jego daje bardziej szczegółowy obraz błędu.

Zmiana ta linia:

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

do:

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

Następnie w bloku catch, dodaj linię:

e.printStackTrace(); 

Również w ścieżce katalogu, to powinno być coś takiego:

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

zamiast

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

Następny, upewnij się, że nabyły uprawnienie do zapisu do pamięci zewnętrznej w Android manifeście.

+0

Okay, Jak mogę edytować mój kod ... czy możesz mnie poprowadzić proszę ... @ shiladitya –

+0

sprawdź edytowaną odpowiedź – shiladitya

+0

Właściwie, plik, który pobieram jest plikiem bazy danych, który jest plikiem, ale nie rozszerzeniem .db. Aby go pobrać z serwera dodałem rozszerzenie i pobrać. Teraz pobrany plik nie ma dostępu, ponieważ ma rozszerzenie. musimy usunąć rozszerzenie po pobraniu lub w inny sposób zadeklarować typ mime dla pliku w webconfig, który nie działa. Tak, Czy możesz mi pomóc, jak usunąć pobieranie extensionafter. Zaktualizowałem swój kod dla tego .. czy możesz raz sprawdzić. –

Powiązane problemy