如何在Android中从服务器下载文件并将其保存到SD卡中特定的文件夹?

24

我在我的安卓应用中有一个要求,需要以编程的方式下载并将文件保存到SD卡的特定文件夹中。 我已经开发了源代码,它是:

我在安卓应用中有一个需求:需要通过编程的方式将文件下载并保存到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的空文件保存在路径中。但我需要下载并将文件内容保存到特定文件夹中。尝试了几种方法来获取文件下载,但都失败了。


我该如何在这个例子中检查文件下载是否已经完成了100%? - Karan Mavadhiya
由于您的数据库文件可能非常大,我强烈建议分块编写文件,而不是将所有流附加到内存中并一次性写入整个文件。 - MikeL
1个回答

15

您的下载链接不是指向任何文件的链接,而是一个目录。请确保其为文件并存在。此外,请检查您的logcat窗口以获取错误日志。另外一个建议是,在catch块中使用printStackTrace()总比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 Manifest 中获得了写入外部存储的权限。


好的,我该如何编辑我的代码?你能指导我吗?@shiladitya - kumar Sudheer
实际上,我正在下载的文件是一个数据库文件,它是一个文件,但不是.db扩展名。为了让它从服务器下载,我添加了扩展名并进行了下载。现在我们下载的文件由于有扩展名而无法访问。我们需要在下载后删除扩展名,或者另一种方法是在webconfig中声明文件的mime类型,但这种方法不起作用。所以,你能指导我如何在下载后删除扩展名吗?我已经更新了我的代码,你能帮忙检查一下吗? - kumar Sudheer
在上面的例子中,有谁能告诉我如何检查文件是否已成功完成了100%? - Karan Mavadhiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接