Descargue archivos y guárdelos localmente con las aplicaciones Phonegap / jQuery Mobile Android y iOS

Escribí una aplicación jQuery Mobile y la empaqué con Phonegap para aplicaciones iOS y Android.

En este punto, estoy usando archivos json almacenados localmente para leer datos.

Me gustaría actualizar estos archivos json de vez en cuando mediante la descarga de archivos json más nuevos de un servidor.

¿Cómo puedo obtener json del servidor y almacenar los archivos json en el sistema de archivos local de Android e iOS?

Cheers Johe

Use FileTransfer.download , aquí hay un ejemplo:

 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); }; } 

Así es como lo resolví. Primero configure las rutas de archivos, que son diferentes para Android e 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 } } 

Luego cargué mis archivos JSON, que están preempacados con la aplicación, en el almacenamiento del navegador local. Me gusta esto:

 localStorage["my_json_data"] = loadJSON(file_path + "my_json_data.json"); function loadJSON(url) { return jQuery.ajax({ url : url, async : false, dataType : 'json' }).responseText; } 

Si quiero actualizar mis datos Obtengo los nuevos Datos JSON del servidor y los meto en el almacenamiento local. Si el servidor está en un dominio diferente, que es el caso la mayor parte del tiempo, debe realizar una llamada JSONP (ver los documentos de jQuery en JSONP ). Lo hice así:

 $.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); }); 

Puedes hacer esto en una línea de código:

 new FileManager().download_file('http://url','target_path',Log('downloaded success')); 

target_path: puede incluir el directorio (ejemplo: dira / dirb / file.html) y los directorios se crearán recursivamente.

Puede encontrar la biblioteca para hacer esto aquí:

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

Mi sugerencia sería buscar en la API de archivos de PhoneGap. No lo he usado yo mismo, pero debería hacer lo que estás buscando.

Respuesta actualizada para el nuevo 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(); } ); } 

Para descargar y mostrar un archivo, siga el código de muestra.

Incluya el código dado justo encima de la etiqueta en su index.html

 < 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( "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); } 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); }  

Consulte: – Publicación del blog