このリンクから次のコードがありますhttp://weblogs.asp.net/soever/cordova-file-transfer-unzip-and-present-adventures必要に応じて URL だけを変更しました。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>DemoZipUnzip</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
<!-- DemoZipUnzip references -->
<link href="css/index.css" rel="stylesheet" />
<!-- Cordova reference, this is added to your app when it's built. -->
<!--<script src="cordova.js"></script>-->
<script src="scripts/platformOverrides.js"></script>
<script src="scripts/index.js"></script>
</head>
<body>
<button id="btnLoad">Load</button>
<button id="btnUnzip">Unzip</button>
<hr />
<div id="statusPlace"></div>
<hr />
<img id="imgPlace" src="http://lorempixel.com/320/200">
<br />
<div id="txtPlace">TEXT COMES HERE</div>
<script type="text/javascript">
document.addEventListener("deviceready", onDeviceReady, false);
function registerHandlers() {
document.getElementById("btnLoad").onclick = function () {
var that = this,
App = new DownloadApp(),
fileName = "Archive.zip",
uri = "http://localhost:63961/check/contentupdate/availableupdates",
folderName = "content";
console.log("load button clicked");
document.getElementById("statusPlace").innerHTML += "<br/>Loading: " + uri;
App.load(uri, folderName, fileName,
/*progress*/function (percentage) { document.getElementById("statusPlace").innerHTML += "<br/>" + percentage + "%"; },
/*success*/function (entry) { document.getElementById("statusPlace").innerHTML += "<br/>Zip saved to: " + entry.toURL(); },
/*fail*/function () { document.getElementById("statusPlace").innerHTML += "<br/>Failed load zip: " + that.uri; }
);
};
document.getElementById("btnUnzip").onclick = function () {
var that = this,
App = new DownloadApp(),
fileName = "Archive.zip",
folderName = "content";
console.log("zip button clicked");
App.unzip(folderName, fileName,
/*success*/function () { alert("Unzipped and assigned"); },
/*fail*/function (error) { alert("Unzip failed: " + error.code); }
);
};
}
function onDeviceReady() {
// navigator.splashscreen.hide();
document.getElementById("statusPlace").innerHTML += "<br/>deviceready event received";
registerHandlers();
}
var DownloadApp = function () {
}
DownloadApp.prototype = {
load: function (uri, folderName, fileName, progress, success, fail) {
var that = this;
that.progress = progress;
that.success = success;
that.fail = fail;
filePath = "";
that.getFilesystem(
function (fileSystem) {
console.log("GotFS");
that.getFolder(fileSystem, folderName, function (folder) {
filePath = folder.toURL() + "/" + fileName;
that.transferFile(uri, filePath, progress, success, fail);
}, function (error) {
console.log("Failed to get folder: " + error.code);
typeof that.fail === 'function' && that.fail(error);
});
},
function (error) {
console.log("Failed to get filesystem: " + error.code);
typeof that.fail === 'function' && that.fail(error);
}
);
},
getFilesystem:function (success, fail) {
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, success, fail);
},
getFolder: function (fileSystem, folderName, success, fail) {
fileSystem.root.getDirectory(folderName, { create: true, exclusive: false }, success, fail)
},
transferFile: function (uri, filePath, progress, success, fail) {
var that = this;
that.progress = progress;
that.success = success;
that.fail = fail;
var transfer = new FileTransfer();
transfer.onprogress = function (progressEvent) {
if (progressEvent.lengthComputable) {
var perc = Math.floor(progressEvent.loaded / progressEvent.total * 100);
typeof that.progress === 'function' && that.progress(perc); // progression on scale 0..100 (percentage) as number
} else {
}
};
transfer.download(
uri,
filePath,
function (entry) {
console.log("File saved to: " + entry.toURL());
typeof that.success === 'function' && that.success(entry);
},
function (error) {
console.log("An error has occurred: Code = " + error.code);
console.log("download error source " + error.source);
console.log("download error target " + error.target);
console.log("download error code " + error.code);
typeof that.fail === 'function' && that.fail(error);
}
);
},
unzip: function (folderName, fileName, success, fail) {
var that = this;
that.success = success;
that.fail = fail;
zip.unzip("cdvfile://localhost/persistent/" + folderName + "/" + fileName,
"cdvfile://localhost/persistent/" + folderName,
function (code) {
console.log("result: " + code);
that.getFilesystem(
function (fileSystem) {
console.log("gotFS");
that.getFolder(fileSystem, folderName + "/ftpack", function (folder) {
document.getElementById("imgPlace").src = folder.nativeURL + "/img.jpg";
folder.getFile("text.html", { create: false }, function (fileEntry) {
fileEntry.file(function (file) {
var reader = new FileReader();
reader.onloadend = function (evt) {
console.log("Read as text");
console.log(evt.target.result);
document.getElementById("txtPlace").innerHTML = evt.target.result;
typeof that.success === ' function && that.success();'
};
reader.readAsText(file);
}, function (error) {
console.log("Failed to get file");
typeof that.fail === 'function' && that.fail(error);
});
}, function (error) {
console.log("failed to get file: " + error.code);
typeof that.fail === 'function' && that.fail(error);
});
}, function (error) {
console.log("failed to get folder: " + error.code);
typeof that.fail === 'function' && that.fail(error);
});
}, function (error) {
console.log("failed to get filesystem: " + error.code);
typeof that.fail === 'function' && that.fail(error);
});
}
);
}
}
</script>
私は彼の投稿でこの男のようなものを達成しようとしているので、zipファイルをダウンロードしてからローカルのサンドボックスファイルシステムに解凍します。「Multi Device Hybrid App」+ Cordova 拡張機能を使用して Visual Studio 2013 内でこのコードをコピー アンド ペーストし、Ripple-Nexus7 (タブレット) を使用して実行しようとすると、素敵な UI が表示されますが、「読み込み」ボタンをクリックすると、次のコードで初めてエラーが発生しました。
getFilesystem:function (success, fail) {
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, success, fail);
},
「LocalFileSystem」が定義されていない場合、VS2013 内の config.xml のプラグイン タブから File、FileTransfer プラグインを追加しようとしましたが、Plugman を使用してこれらのプラグインを取得できませんでした。最終的に、これらのパッケージを GitHub からダウンロードし、ソリューション エクスプローラーからプロジェクト内に plug_ins フォルダーを追加し、これらのプラグインをその plug_ins フォルダーに配置して、内部ファイルとフォルダー構造をそのまま維持しました。 IntelliSense で LocalFileSystem オブジェクトを見つけることができます。これは、何らかの奇妙な理由で、同じ LocalFileSystem 未定義エラーが返されないことを意味しますが、これらのプラグインはまだ機能していません)。
コードを実行すると、「読み込み」ボタンをクリックすると UI が表示され、何も起こらず、その前に「onDeviceReady」関数が「deviceready」イベントで呼び出されるはずですが、そこでも何も起こりません。
私は Javascript と Cordova に非常に慣れていないので、この点で多くの助けが必要です。これらの問題を解決するために私を助けてくれるすべての人に心から感謝します.