如何从服务器下载文件并将其保存在Android中SD卡的特定文件夹中?
我的Android应用程序中有一个要求。我需要以编程方式下载文件并保存在SD卡的特定文件夹中。我已经开发了源代码,这是如何从服务器下载文件并将其保存在Android中SD卡的特定文件夹中?,android,android-input-method,android-download-manager,Android,Android Input Method,Android Download Manager,我的Android应用程序中有一个要求。我需要以编程方式下载文件并保存在SD卡的特定文件夹中。我已经开发了源代码,这是 String DownloadUrl = "http://myexample.com/android/"; String fileName = "myclock_db.db"; DownloadDatabase(DownloadUrl,fileName); // and the method is public void DownloadData
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的空文件。但我需要下载并将文件内容保存在特定文件夹中。尝试了几种方法来下载文件,但我无法下载。您的下载URL不是指向任何文件的链接。这是一个目录。确保它是一个文件并且存在。还要检查logcat窗口中的错误日志。还有一个建议,最好在catch块中执行printStackTrace(),而不是在日志中执行。它给出了错误的更详细的视图 更改此行:
URL url = new URL("http://myexample.com/android/");
e.printStackTrace();
致:
接下来,在catch块中,添加以下行:
URL url = new URL("http://myexample.com/android/");
e.printStackTrace();
在目录路径中,也应该是这样的:
File dir = new File(root.getAbsolutePath() + "/mnt/sdcard/myclock/databases");
而不是
File dir = new File(root.getAbsolutePath() + "/myclock/databases");
接下来,请确保您已获得在Android清单中写入外部存储的权限。好的,我如何编辑代码。。你能给我介绍一下吗?@shiladityaa实际上,我正在下载的文件是一个数据库文件,它是一个文件,但不是.db的扩展名。为了让它从服务器上下载,我添加了扩展并下载了它。现在我们下载的文件没有被访问,因为它有一个扩展名。我们需要在下载后删除扩展名,或者另一种方法是在webconfig中为不起作用的文件声明mime类型。那么,你能告诉我下载后如何删除扩展吗。我为此更新了代码。。你能检查一次吗?在上面的例子中,谁能说我怎么能检查文件100%成功完成?在这个例子中,我怎么能检查文件下载100%完成?因为你的db文件可能很大,我强烈建议将文件分块写入,而不是将所有流附加到内存中,然后一次写入整个文件。