Salutacions, companys. Preciós als meus servidors de combat
Els amics em van demanar que els configurés una granja de desenvolupament i, en lloc d'arrossegar-los les meves plantilles específiques, vaig recordar un projecte interessant.
Per descomptat, abans d'explorar les fonts, vaig mirar d'on Chrome extreu l'arxiu zip generat amb les configuracions, i allí m'esperava una adreça que començava per "blob:", vaja. Ja ha quedat clar que el servei no genera res al llarg del camí, de fet, tot ho fa js. De fet, l'arxiu zip el genera el client, el navegador i javascript mateix. Aquells. la bellesa és que el projecte
Després de bifurcar el projecte, vaig començar a pensar quines eren les meves opcions. La tasca es va complicar pel fet que no volia desviar-me de la condició que el projecte hagués de seguir sent un front-end pur, sense cap back-end. Per descomptat, la solució més senzilla seria treure nodejs i forçar-lo a generar un arxiu amb configuracions mitjançant enllaços directes.
De fet, no hi havia moltes opcions. Més precisament, només se n'ha vingut al cap un. Hem de configurar les configuracions i obtenir un enllaç que podem copiar a la consola del servidor per obtenir un arxiu zip.
Diversos fitxers de text de l'arxiu zip resultant pesaven bastant, literalment uns quants kilobytes. La solució òbvia era obtenir la cadena base64 de l'arxiu zip generat i llançar-la a la memòria intermèdia, mentre es trobava al servidor amb l'ordre a la consola.
echo 'base64string' | base64 --decode > config.zip
podríem crear aquest mateix fitxer zip.
Als recursos del projecte veiem un mètode per generar un arxiu zip:
$scope.downloadZip = function() {
var zip = new JSZip();
var sourceCodes = $window.document.querySelectorAll('main .file .code.source');
for (var i = 0; i < sourceCodes.length; i++) {
var sourceCode = sourceCodes[i];
var name = sourceCode.dataset.filename;
var content = sourceCode.children[0].children[0].innerText;
if (!$scope.isSymlink() && name.match(/^sites-available//)) {
name = name.replace(/^sites-available//, 'sites-enabled/');
}
zip.file(name, content);
if (name.match(/^sites-available//)) {
zip.file(name.replace(/^sites-available//, 'sites-enabled/'), '../' + name, {
unixPermissions: parseInt('120755', 8),
});
}
}
zip.generateAsync({
type: 'blob',
platform: 'UNIX',
}).then(function(content) {
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
});
gtag('event', $scope.getDomains().join(','), {
event_category: 'download_zip',
});
};
tot és bastant senzill, utilitzant la biblioteca
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
on el contingut és l'objecte blob resultant de l'arxiu zip.
D'acord, tot el que havia de fer era afegir un altre botó al costat i quan hi feia clic, no desaria l'arxiu zip resultant al navegador, sinó que n'obtenia el codi base64. Després de jugar una mica, vaig obtenir 2 mètodes, en lloc d'una sola descàrrega ZIP:
$scope.downloadZip = function() {
generateZip(function (content) {
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
});
gtag('event', $scope.getDomains().join(','), {
event_category: 'download_zip',
});
};
$scope.downloadBase64 = function() {
generateZip(function (content) {
var reader = new FileReader();
reader.readAsDataURL(content);
reader.onloadend = function() {
var base64 = reader.result.replace(/^data:.+;base64,/, '');
// в переменной base64 как раз нужный мне zip архив в виде base64 строки
}
});
gtag('event', $scope.getDomains().join(','), {
event_category: 'download_base64',
});
};
Com haureu notat, vaig traslladar la generació de l'arxiu zip al mètode privat generateZip, i així successivament. Això és AngularJS, i el mateix autor s'adhereix a les devolucions de trucada i no ho va implementar mitjançant promeses. downloadZip encara va fer SaveAs com a sortida, mentre que downloadBase64 va fer alguna cosa lleugerament diferent. Creem un objecte FileReader que ens va arribar en html5 i que ja és bastant
position: absolute;
z-index: -1;
opacity: 0;
que em va permetre ocultar l'element de la vista i deixar-lo a la pàgina. Voila, la tasca es va completar, quan vaig fer clic al meu botó, es va col·locar una línia com aquesta a la memòria intermèdia:
echo 'base64string' | base64 --decode > config.zip
que simplement vaig enganxar a la consola del servidor i de seguida vaig rebre un arxiu zip amb totes les configuracions.
I, per descomptat, vaig enviar una sol·licitud d'extracció a l'autor, perquè... el projecte és actiu i animat, m'agradaria veure actualitzacions de l'autor i tenir el meu propi botó) Per als interessats, aquí el teniu
Feliç desenvolupament a tothom)
Font: www.habr.com