本文概述
如今, 移动设备几乎可以执行所有操作。压缩文件允许用户操纵很多文件, 而他只能操纵一个文件。从源代码下载文件后, 也可以在Cordova中解压缩文件。本文的方法不会使用JavaScript解压缩文件, 因为通过使用客户端语言来完成任务可能会变得很乏味, 因此我们建议你使用本机代码。但请放心, 由于有一个可为你处理本机代码的插件, 你仍可以使用JavaScript进行编程!
1.安装cordova-plugin-zip
为了将内容从zip文件提取到设备的某个目录中, 我们建议你使用cordova-plugin-zip插件。该插件在Android中使用java.util.zip和iOS中的SSZipArchive。
安装执行以下cordova命令的插件:
cordova plugin add cordova-plugin-zip
该插件适用于Android和iOS。如果你需要有关此插件的更多信息, 请访问Github上的官方存储库。
2.使用插件
该插件在其全局变量zip.unzip中公开一个方法。此方法按以下顺序期望最多4个参数:
- ZipPath:要解压缩的zip文件的绝对路径。
- ZipExtractDirectory:应将文件提取到的文件夹的绝对路径。
- StatusCallback:该函数接收作为唯一参数的数字, 该数字通知文件是否成功解压缩(成功则为0, 失败则为-1)。
- ProgressCallback:每当减压进度更改时执行的函数。接收带有进度信息的对象作为第一个参数。
请记住, 在窗口的deviceready事件之后包装所有代码, 否则插件将无法工作:
document.addEventListener('deviceready', function(){
// All your code here ...
}, false);
一旦确定将执行代码, 就可以继续为库的unzip函数提供参数:
// Path to the file
var ZipPath = "file:///storage/emulated/0/some-zipfile.zip";
// Path of the destination folder
var ZipExtractDirectory = "/storage/emulated/0/";
// Handle the result of the process
var StatusCallback = function(status){
if(status == 0){
// Everything OK
}else if(status == -1){
// Everything is wrong ...
}
};
// Handle the progress of the decompression
var ProgressCallback = function(progressEvent){
var percent = Math.round((progressEvent.loaded / progressEvent.total) * 100);
// Display progress in the console : 8% ...
console.log(percent + "%");
};
// Unzip it !
window.zip.unzip(ZipPath, ZipExtractDirectory, StatusCallback, ProgressCallback);
请注意, 源参数和目标参数都可以是从HTML File接口获得的URL, 也可以是设备上文件的绝对路径, 这意味着它们可以包含file://或不包含file://。
例子
使用Android Cordova的FileBrowser插件, 我们将选择一个zip文件, 并将其内容提取到Android存储设备的根文件夹中:
document.addEventListener('deviceready', onDeviceReady, false);
function onDeviceReady(){
// When the user clicks some button to select the file
document.getElementById("btn").addEventListener("click", () => {
// Open the single file selector
window.OurCodeWorld.Filebrowser.filePicker.single({
success: function(data){
if(!data.length){
// No file selected
return;
}
// data = Array with filepath
// ["file:///storage/emulated/0/file.zip"]
// Extract in the root folder of the storage
processZip(data[0], "/storage/emulated/0");
}, error: function(err){
console.log(err);
}
});
}, false);
}
/**
*
* @param zipSource Path to the zip file
* @param destination Path where the content should be placed
*/
function processZip(zipSource, destination){
// Handle the progress event
var progressHandler = function(progressEvent){
var percent = Math.round((progressEvent.loaded / progressEvent.total) * 100);
// Display progress in the console : 8% ...
console.log(percent + "%");
};
// Proceed to unzip the file
window.zip.unzip(zipSource, destination, (status) => {
if(status == 0){
console.log("Files succesfully decompressed");
}
if(status == -1){
console.error("Oops, cannot decompress files");
}
}, progressHandler);
}
编码愉快!