Как скачать файл с сервера и сохранить его в определенной папке на 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. но мне нужно скачать и сохранить содержимое файла в определенной папке. Пробовал несколько способов загрузить файл, но не могу.
1 ответ
Ваш загрузочный URL не является ссылкой на какой-либо файл. Это каталог. Убедитесь, что это файл и существует. Также проверьте окно logcat на наличие журналов ошибок. Еще одно предложение, всегда лучше сделать printStackTrace() в блоках catch вместо Logs. Это дает более подробное представление об ошибке.
Измените эту строку:
URL url = new URL("http://myexample.com/android/");
чтобы:
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.