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

Posted

技术标签:

【中文标题】如何从服务器下载文件并将其保存在 Android SD 卡中的特定文件夹中?【英文标题】:How to download a file from a server and save it in specific folder in SD card in Android? 【发布时间】:2013-04-13 13:57:30 【问题描述】:

我的 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 的空文件保存在路径中。但我需要下载文件内容并将其保存在特定文件夹中。尝试了几种方法来获取文件下载,但我不能。

【问题讨论】:

如何在这个示例中检查文件下载完成 100% 因为您的 db 文件可能很大,我强烈建议您将文件分块写入,而不是将所有流附加到内存中并一次写入整个文件。 【参考方案1】:

您的下载 URL 不是任何文件的链接。这是一个目录。确保它是一个文件并且存在。还要检查您的 logcat 窗口中的错误日志。还有一个建议,在 catch 块而不是 Logs 中执行 printStackTrace() 总是更好。它提供了错误的更详细视图。

改变这一行:

    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 清单中写入外部存储的权限。

【讨论】:

好的,我怎样才能编辑我的代码..你能指导我吗..@shiladitya 实际上,我下载的文件是一个数据库文件,它是一个文件,但不是.db的扩展名。为了让它从服务器下载,我添加了扩展并下载。现在我们下载的文件无法访问,因为它有扩展名。我们需要在下载后删除扩展名,或者另一种方法是在 webconfig 中声明文件的 mime 类型不起作用。那么,你能指导我如何在下载后删除扩展名吗?我为此更新了我的代码..你能检查一次吗? 任何人都可以说在上面的示例中我如何检查该文件已成功完成 100%...

以上是关于如何从服务器下载文件并将其保存在 Android SD 卡中的特定文件夹中?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何下载媒体文件并将其保存在设备上

如何从 URL 下载文件并将其保存在 Rails 中?

如何从 Flutter 中的 URL 下载文件并将其保存在 iOS 共享文件夹中?

PHP 从FTP服务器下载文件并将其保存在本地文件中。

从FTP服务器下载文件并将其保存在本地文件中。

如何序列化对象并将其保存到 Android 中的文件中?