如何将下载的文件保存到我的应用程序以供以后使用?

时间:2013-12-30 07:26:11

标签: android file sqlite download

我的应用使用API​​将数据保存到数据库。部分数据将包括文件的URL(pdf,图像和视频)。我已经通过AsyncTask做了这个api请求。

我的计划是使用api提供的网址 - >在本地保存文件 - >将他们的位置存储在数据库中。

这样我可以根据一组SQLite参数调出pdf文档列表,获取文件信息,创建文件列表,并允许用户查看pdf(或图像......或视频) ...)选择它。

我有一切工作,但不知道如何

  1. 从网址
  2. 下拉文件
  3. 在本地保存文件
  4. 将当前保存的文件位置保存到数据库
  5. 我知道这是一个很大的问题,我更关心如何实现这一目标。有很多资源,但选择最佳选择是压倒性的。

    谢谢!

    -----编辑-----

    使用Zygote的答案后出现错误:

    java.io.FileNotFoundException: /storage/emulated/0/library/2/invester-service.jpg: open failed: ENOENT (No such file or directory)
        at libcore.io.IoBridge.open(IoBridge.java:416)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
        at com.myBooks.library.BooksDB$1.run(BooksDB.java:812)
        at java.lang.Thread.run(Thread.java:856)
    Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
        at libcore.io.Posix.open(Native Method)
        at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
        at libcore.io.IoBridge.open(IoBridge.java:400)
    

    我可以看到第812行在错误中被调出(显示809-812):

    File file = new File(SDCardRoot + "/library/"+file_type,file_name);
    
    //this will be used to write the downloaded data into the file we created
    FileOutputStream fileOutput = new FileOutputStream(file);
    

    我已经添加了代码来创建目录(根据Zygote的建议),但是我得到了同样的错误。 mkdir失败,存储状态显示在运行时挂载:

    File folder = new File(Environment.getExternalStorageDirectory() + "/library/"+file_type);
    String state = Environment.getExternalStorageState();
    //create a new file, specifying the path, and the filename
    //which we want to save the file as.
    
    boolean success = true;
    if (!folder.exists()) {
        success = folder.mkdir();
        Log.d("storage state",state);
    }
    if (success) {
        // Do something on success
        Log.d("success","made it");
    } else {
        // Do something else on failure 
        Log.d("success","didn't made it");
    }
    

1 个答案:

答案 0 :(得分:1)

它实际上相当简单。只需使用HttpURLConnection和输入输出流即可完成1和2,即可下载文件并将其保存到您喜欢的任何位置。然后,只需向数据库类添加一个方法,即将保存文件的位置存储到数据库中。

我写了一个非常简单的文件下载应用程序,其中包括第一和第二任务所需的所有代码。这里复制/粘贴有点太多了,所以我只是给你发送GitHub源链接。查看102行及以下here

请记住,永远不要在GUI线程上运行网络代码!

祝你好运!