Загружайте файлы и храните их локально с помощью Phonegap/jQuery Mobile Android и iOS Apps
Я написал приложение jQuery Mobile и упаковал его с помощью Phonegap в приложения для iOS и Android.
В этот момент я использую локально сохраненные json файлы для чтения данных.
Я хотел бы время от времени обновлять эти json файлы, загружая новые json файлы с сервера.
Как я могу получить json с сервера и хранить json файлы в локальной файловой системе Android и iOS?
Приветствия
Johe
Ответы
Ответ 1
Вот как я это решил. Сначала задайте пути к файлам, которые отличаются для 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 (проверить документы jQuery на JSONP).
Я сделал это так:
$.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);
});
Ответ 2
Используйте 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);
};
}
Ответ 3
Вы можете сделать это в одной строке кода:
new FileManager().download_file('http://url','target_path',Log('downloaded success'));
target_path: может включать каталог (пример: dira/dirb/file.html), и каталоги будут созданы рекурсивно.
Вы можете найти библиотеку, чтобы сделать это здесь:
https://github.com/torrmal/cordova-simplefilemanagement
Ответ 4
Мое предложение - посмотреть в PhoneGap File API. Я не использовал его сам, но он должен делать то, что вам нужно.
Ответ 5
Обновленный ответ для новой Кордовы
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();
}
);
}
Ответ 6
Для загрузки и отображения файла следуйте образцу кода.
Включите данный код чуть выше тега </head>
в 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);
}
</script>
Обратитесь: Сообщение в блоге