使用Phonegap / jQuery Mobile Android和iOS应用程序下载文件并将其存储在本地
我写了一个jQuery Mobile应用程序,并将其与Phonegap打包到iOS和Android应用程序中。
在这一点上,我正在使用本地存储的JSON文件来读取数据。
我想不时更新这些json文件,从服务器上下载新的json文件。
我怎样才能从服务器获取JSON并将JSON文件存储到Android和iOS的本地文件系统?
欢呼Johe
使用FileTransfer.download
,这里是一个例子:
function downloadFile(){ window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function onFileSystemSuccess(fileSystem) { fileSystem.root.getFile( "dummy.html", {create: true, exclusive: false}, function gotFileEntry(fileEntry) { var sPath = fileEntry.fullPath.replace("dummy.html",""); var fileTransfer = new FileTransfer(); fileEntry.remove(); fileTransfer.download( "2011/web-apps-ws/papers/Nitobi.pdf", sPath + "theFile.pdf", function(theFile) { console.log("download complete: " + theFile.toURI()); showLink(theFile.toURI()); }, function(error) { console.log("download error source " + error.source); console.log("download error target " + error.target); console.log("upload error code: " + error.code); } ); }, fail); }, fail); }; }
这就是我解决它的方法。 首先设置文件path,这对于Android和iOS是不同的
var file_path; function setFilePath() { if(detectAndroid()) { file_path = "file:///android_asset/www/res/db/"; //4 Android } else { file_path = "res//db//"; //4 apache//iOS/desktop } }
然后,我将我的JSON文件加载到本地浏览器存储中,这些文件与应用程序预先打包在一起。 喜欢这个:
localStorage["my_json_data"] = loadJSON(file_path + "my_json_data.json"); function loadJSON(url) { return jQuery.ajax({ url : url, async : false, dataType : 'json' }).responseText; }
如果我想更新我的数据。 我从服务器获取新的JSON数据并将其推送到本地存储中。 如果服务器位于不同的域中,那么大多数情况下都是这样的,您必须进行JSONP调用(检查JSONP上的jQuery文档)。 我这样做有点像:
$.getJSON(my_host + 'json.php?function=' + my_json_function + '&callback=?', function (json_data) { //write to local storage localStorage["my_json_data"] = JSON.stringify(json_data); });
你可以在一行代码中做到这一点:
new FileManager().download_file('http://url','target_path',Log('downloaded success'));
target_path:可以包含目录(例如:dira / dirb / file.html),目录将以recursion方式创build。
你可以在这里find这个库:
我的build议是查看PhoneGap的File API 。 我没有用过它,但它应该做你以后的事情。
新cordova更新答案
function downloadFile(url, filename, callback, callback_error) { var fileTransfer = new FileTransfer(); fileTransfer.download(url, cordova.file.dataDirectory + "cache/" + filename, function (theFile) { console.log("download complete: " + theFile.toURL()); if (callback) callback(); }, function (error) { console.log("download error source " + error.source); console.log("download error target " + error.target); console.log("upload error code: " + error.code); if (callback_error) callback_error(); } ); }
要下载和显示文件,请按照示例代码。
在index.html中的</head>
标记上方加上给定的代码
< script type = "text/javascript" charset = "utf-8" > // Wait for Cordova to load document.addEventListener("deviceready", onDeviceReady, false); // Cordova is ready function onDeviceReady() { alert("Going to start download"); downloadFile(); } function downloadFile() { window.requestFileSystem( LocalFileSystem.PERSISTENT, 0, function onFileSystemSuccess(fileSystem) { fileSystem.root.getFile( "dummy.html", { create: true, exclusive: false }, function gotFileEntry(fileEntry) { var sPath = fileEntry.fullPath.replace("dummy.html", ""); var fileTransfer = new FileTransfer(); fileEntry.remove(); fileTransfer.download( "2011/web-apps-ws/papers/Nitobi.pdf", sPath + "theFile.pdf", function(theFile) { console.log("download complete: " + theFile.toURI()); showLink(theFile.toURI()); }, function(error) { console.log("download error source " + error.source); console.log("download error target " + error.target); console.log("upload error code: " + error.code); } ); }, fail); }, fail); } function showLink(url) { alert(url); var divEl = document.getElementById("deviceready"); var aElem = document.createElement("a"); aElem.setAttribute("target", "_blank"); aElem.setAttribute("href", url); aElem.appendChild(document.createTextNode("Ready! Click To Open.")) divEl.appendChild(aElem); } function fail(evt) { console.log(evt.target.error.code); } </script>
请参阅: – 博客文章
- 从v4.Fragment请求运行时权限,并callback到Fragment?
- 在使用GSon的android中@SerializedName注释的基本用途是什么?
- 如何使注解,如突出显示,删除线,下划线,绘制,添加文本等在Android中的PDF查看器?
- MAT(Eclipse内存分析器) – 如何查看内存转储的位图
- 在我的项目中使用android.support.v7.widget.CardView(Eclipse)
- onActivityResult不在Fragment中调用
- 在Android中使用Retrofit
- 如何在Android平台上反编译APK或DEX文件?
- 如何用RecyclerView显示一个空视图?