美文网首页Web 前端开发
node文件(夹)压缩、不解压读取文件内容、zip包伪加密

node文件(夹)压缩、不解压读取文件内容、zip包伪加密

作者: 无相__ | 来源:发表于2018-11-13 18:36 被阅读0次

    近期需要实现以下几个需求,完成之后特此记录,以供同学们参考:
    1、使用node实现文件及文件夹进行压缩。
    2、使用node实现zip加密压缩(非对文件加密,是对压缩包加密)。
    3、使用node实现在不解压zip包的前提下读取其内容。
    4、使用node对zip包进行伪加密。

    安装相关包及插件(需求1、2、3)
    npm init -y //新建一个文件夹并且初始化node项目
    npm i -S adm-zip //安装adm-zip包
    npm i -S archiver //安装archiver包
    npm i -S chilkat_node10_win32 //安装chilkat_node10_win32包(只安装了一个版本,以作演示)
    
    

    关键代码如下:

    //index.js
    var fs = require('fs');  //引入fs模块,对文件进行操作
    var archiver = require('archiver'); // archiver可用于普通的打包压缩
    var AdmZip = require('adm-zip');  //用于读取未解压的zip包
    
    var filePath = 'C:/Users/qingk/Desktop/test/src/' //获取文件路径
    var dirList = fs.readdirSync(filePath); //获取文件列表
    var zipPath = 'C:/Users/qingk/Desktop/test/src.zip';  //压缩包生成路径
    
    var level = 9;  //压缩等级
    //创建最终打包文件的输出流
    var output = fs.createWriteStream(zipPath);
    //生成archiver对象,打包类型为zip
    var archive = archiver('zip', {
        zlib: {
            level: level
        }
    });
    //功能一
    //对文件进行压缩
    // dirList.forEach(item=>{
    //     archive.append(fs.createReadStream(filePath+item), {'name': item});
    // })
    //对文件夹进行压缩
    archive.directory(filePath, false);
    archive.pipe(output); //将打包对象与输出流关联
    //监听所有archive数据都写完
    output.on('close', function() {
        console.log('压缩完成', archive.pointer() / 1024 / 1024 + 'M');
        // printData();
        readZip();
    });
    archive.on('error', function(err) {
        throw err;
    });
    //打包
    archive.finalize();
    
    //功能二
    //不解压的情况下读取相关文件
    function printData(){
        var zip = new AdmZip(zipPath);
        var zipEntries = zip.getEntries();
        console.log(zipEntries);
        zipEntries.forEach((item) => {
            if(item.name=="a.txt")console.log(item.getData().toString());
            if (item.isDirectory == false) {
                console.log(item.getData().toString());
                // this.text = item.getData().toString();
            }
        });
    }
    
    //功能三
    // 使用Chilkat(选择操作系统及工具)(貌似还收费)
    // 参考地址:https://www.example-code.com/nodejs/zip_passwordProtect1.asp
    // zip相关操作API:https://www.chilkatsoft.com/refdoc/nodejsZipRef.html
    var os = require('os');
    console.log(os.platform());
    if (os.platform() == 'win32') {
        var chilkat = require('chilkat_node10_win32');
    } else if (os.platform() == 'linux') {
        if (os.arch() == 'arm') {
            var chilkat = require('chilkat_node10_arm');
        } else if (os.arch() == 'x86') {
            var chilkat = require('chilkat_node10_linux32');
        } else {
            var chilkat = require('chilkat_node10_linux64');
        }
    } else if (os.platform() == 'darwin') {
        var chilkat = require('chilkat_node10_macosx');
    }
    
    function chilkatExample() {
        var zip = new chilkat.Zip();
        var success;
        //  Any string unlocks the component for the 1st 30-days.
        success = zip.UnlockComponent("Anything for 30-day trial");
        if (success !== true) {
            console.log(zip.LastErrorText);
            return;
        }
        success = zip.NewZip(zipPath);
        if (success !== true) {
            console.log(zip.LastErrorText);
            return;
        }
    
        zip.SetPassword("00000");
        zip.PasswordProtect = true;
    
        var saveExtraPath;
        saveExtraPath = true;
        success = zip.AppendOneFileOrDir(zipPath,saveExtraPath);
        console.log(success);
        var success = zip.WriteZipAndClose();
        if (success !== true) {
            console.log(zip.LastErrorText);
            return;
        }
    }
    
    需求4:这里说下对于node实现zip包伪加密的思路,感兴趣的同学可以自己去操作一下。

    1、zip文件格式

    [local file header + file data + data descriptor]{1,n} + central directory + end of central directory record

    [文件头+文件数据+数据描述符]{此处可重复n次}+核心目录+目录结束标识

    压缩源文件数据部分:[local file header + file data + data descriptor]
    其中,local file header 文件头,用于标识该文件的开始,记录了该压缩文件的信息。

    Offset Bytes Description 翻译
    0 4 Local file header signature = 0x04034b50 (read as a little-endian number) 文件头标识,值固定(0x04034b50)
    4 2 Version needed to extract (minimum) 解压文件所需 pkware最低版本
    6 2 General purpose bit flag 通用比特标志位(置比特0位=加密)
    8 2 Compression method 压缩方式
    10 2 File last modification time 文件最后修改时间
    12 2 File last modification date 文件最后修改日期
    14 2 CRC-32 CRC-32校验码
    18 4 Compressed size 压缩后的大小
    22 4 Uncompressed size 未压缩的大小
    26 4 File name length (n) 文件名长度
    28 2 Extra field length (m) 扩展区长度
    30 n File name 文件名
    30+n m Extra field 扩展区

    2、实现方式:通过node读取压缩包的buffer值,修改其中加密位的值(奇数为加密),就可以实现伪加密,需要记录值以便解密。

    相关文章

      网友评论

        本文标题:node文件(夹)压缩、不解压读取文件内容、zip包伪加密

        本文链接:https://www.haomeiwen.com/subject/hwblfqtx.html