Electronjs trabajar con archivos zip

En las aplicaciones de Electronjs podemos trabajar con archivos zip tanto descomprimiendolos como generando nuevos archivos comprimidos. Para ello usamos el paquete jszip.

Si trabajamos en el back se puede descomprimir, comprimir y guardar el resultado en el disco duro usando jszip y fs.

Lo instalamos en la carpeta de nuestro proyecto:

npm install jszip

Y en la parte superior de nuestro archivo index.js lo instanciamos:

const JSZip = require('jszip');

Para crear un archivo zip:

let zip = new JSZip();
let nomzip = ’archivo.zip’;
let ruta = basepath + '/src/fotos/';
//los archivos, en este caso son json rellenados con el contenido de variables
zip.file("config.json", JSON.stringify( config ));
// las fotos recorro una carpeta de imagenes
var img = zip.folder("fotos");
fs.readdir(ruta, function(err, files) {
files.forEach(function(file) {
try {
let bitmap = fs.readFileSync(ruta + file);
let b64 = bitmap.toString('base64');
img.file(file, b64, {base64: true});
} catch (err) {
console.log(file + "da error");
}
});
zip.generateNodeStream({type:'nodebuffer',streamFiles:true})
.pipe(fs.createWriteStream(basepath + '/src/' + nomzip + '.zip'))
.on('finish', function () {
event.returnValue = { result: 'ok', dato: './src/' + nomzip + '.zip' };
});
});

También podemos descomprimir un archivo y guardar su contenido.

fs.readFile(basepath + '/assets/seg/' + arg.dato, (err, data) => {
if (err) { console.error(err); return }
var zip = new JSZip();
zip.loadAsync(data).then(function(zip) { 
let numfiles = Object.keys(zip.files).length;
let cont = 1;
let inmusdato = [];
zip.forEach(function (relativePath, zipEntry) { 
if(!zipEntry.dir) {
let nom = zipEntry.name;
let ter = nom.split(".")[1];
if(ter === "json") {
zipEntry.async('string').then(function(content) {
try {
fs.writeFileSync(basepath + '/assets/data/' + nom, content);
switch(nom) {
case "config.json": global.config = JSON.parse(content); break;      
}
cont ++;                               
if(cont == numfiles) { 
event.returnValue = { result: 'ok', dato: global.config};
}
} catch(err) {
console.error(err);
}
});
}else{
zipEntry.async('base64').then(function(content) {
var b64 = content.replace(/^data:image\/png;base64,/, "");
try {                          fs.writeFileSync(basepath + '/assets/' + nom, b64, { encoding: 'base64' } );
cont ++;                               if(cont == numfiles) { event.returnValue = { result: 'ok', dato: global.config}; }
} catch(err) {
console.error(err);
}
});
}
}
});
}, function() {
event.returnValue = { result: 'no es zip', dato: {} };
});
});

Para saber el número de archivos que contiene usamos:

let numfiles = Object.keys(zip.files).length;

Como para leer los archivos internos usamos la orden async que es asíncrona, uso las variables cont y numfiles para saber si he acabado y avisar al front.

Para ler el contenido y escribir los archivos en el disco duro uso fs.

Si vamos a trabajar en el front tenemos que copiar eljszip.js dentro de la carpeta src (yo lo monto en una carpeta js y dentro de ella la subcarpeta lib) e importar la librería jszip.min.js en el index.html:

<script src="src/lib/jszip.min.js"></script>

En el front solo podemos hacerlo para ofrecer la descarga del archivo a el usuario:

let zip = new JSZip();

Rellenamos una variable con el contenido a incluir en el zip:

let conte = ‘{ “nom”: “paco”};

Incluimos el contenido en el objeto zip:

zip.file("./assets/data/config.json","content");

Si quisieramos incluir una carpeta:

var img = zip.folder("images");
Let b64 = " aquí tendríamos que tener el contenido de la imagen en base64 ";
img.file("smile.gif", b64, {base64: true});

Creamos el archivo zip:

zip.generateAsync({
type:"base64",
compression: "DEFLATE",
compressionOptions: { level: 9 }
}).then(function (content) {
//esto lo realiza una vez creado el zip
//usando un elemento del html no visible simulamos la petición de descarga
let copseglnk = document.getElementById('descargarzip');
copseglnk.href = "data:application/zip;base64,"+content;
copseglnk.click();
});

El artículo anterior fue «Electron hacer peticiones http».

Compartir