我的应用使用API将数据保存到数据库。部分数据将包括文件的URL(pdf,图像和视频)。我已经通过AsyncTask做了这个api请求。
我的计划是使用api提供的网址 - >在本地保存文件 - >将他们的位置存储在数据库中。
这样我可以根据一组SQLite参数调出pdf文档列表,获取文件信息,创建文件列表,并允许用户查看pdf(或图像......或视频) ...)选择它。
我有一切工作,但不知道如何
我知道这是一个很大的问题,我更关心如何实现这一目标。有很多资源,但选择最佳选择是压倒性的。
谢谢!
-----编辑-----
使用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");
}
答案 0 :(得分:1)
它实际上相当简单。只需使用HttpURLConnection和输入输出流即可完成1和2,即可下载文件并将其保存到您喜欢的任何位置。然后,只需向数据库类添加一个方法,即将保存文件的位置存储到数据库中。
我写了一个非常简单的文件下载应用程序,其中包括第一和第二任务所需的所有代码。这里复制/粘贴有点太多了,所以我只是给你发送GitHub源链接。查看102行及以下here
请记住,永远不要在GUI线程上运行网络代码!
祝你好运!