使用Phonegap/jQuery Mobile Android和iOS应用程序下载文件并将其存储在本地

j7n*_*n7k 43 android ios jquery-mobile cordova

我写了一个jQuery Mobile应用程序,并将它与Phonegap打包到iOS和Android应用程序.

此时我使用本地存储的json文件来读取数据.

我想通过从服务器下载更新的json文件来不时更新这些json文件.

如何从服务器获取json并将json文件存储到Android和iOS的本地文件系统?

干杯Johe

jus*_*oon 94

使用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(
                "http://www.w3.org/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);
};
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是dummy.html这里.. ?? (5认同)
  • 感谢您提供这段惊人的代码.它拥有我需要的一切......除了最后提到的失败变量之外.如果你打算使用它,只需将fail定义为如下函数:function fail(error){console.log(error.code); } (4认同)
  • 此代码将不再适用于较新版本的Cordova API.他们改变了一点,看到这个主题 - http://stackoverflow.com/questions/21756274/phonegap-ios-why-when-i-get-the-full-path-of-the-filesystem-in-a- device-or-s另外,创建虚拟并不是必需的,你可以使用fileSystem.root.toNativeURL() (3认同)
  • 你能记录你的代码吗?像Johe一样在下面? (2认同)
  • 我如何强制它不使用外部存储并将其存储在www目录下创建的abc文件夹中? (2认同)

j7n*_*n7k 24

这就是我解决它的方式.首先设置文件路径,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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我将我的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;
}
Run Code Online (Sandbox Code Playgroud)

如果我想更新我的数据.我从服务器获取新的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);

});
Run Code Online (Sandbox Code Playgroud)

  • 这是一种糟糕的方法,因为它同时使用async:false和跨域请求.您应该使用phonegaps FileTransfer.download而不是http://docs.phonegap.com/en/2.0.0/cordova_file_file.md.html#FileTransfer (6认同)

Jor*_*res 8

您可以在一行代码中执行此操作:

new FileManager().download_file('http://url','target_path',Log('downloaded success'));
Run Code Online (Sandbox Code Playgroud)

target_path:可以包含目录(例如:dira/dirb/file.html),并且将以递归方式创建目录.

您可以在此处找到要执行此操作的库:

https://github.com/torrmal/cordova-simplefilemanagement