如何在Cordova中解压缩(zip)压缩文件

本文概述

如今, 移动设备几乎可以执行所有操作。压缩文件允许用户操纵很多文件, 而他只能操纵一个文件。从源代码下载文件后, 也可以在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);
}

编码愉快!

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?