Gréiss, Komeroden. Schéin op menger Kampfserver
D'Frënn hunn mech gefrot fir en Entwécklungsbauerenhaff fir si opzestellen, an amplaz se meng spezifesch Templates ze zéien, hunn ech mech un en interessante Projet erënnert.
Natierlech, ier ech an d'Quellen gegruewen hunn, hunn ech gekuckt wou Chrome de generéierten Zip-Archiv mat Konfiguratiounen zitt, an do waart eng Adress, déi mat "blob:" fänkt, op mech, ops. Et ass scho kloer ginn datt de Service näischt laanscht de Wee generéiert, tatsächlech gëtt alles vum js gemaach. Tatsächlech gëtt den Zip-Archiv vum Client, de Browser a Javascript selwer generéiert. Déi. der Schéinheet ass, datt de Projet
Nodeems ech de Projet forcéiert hunn, hunn ech ugefaang ze denken wat meng Optiounen waren. D'Aufgab war komplizéiert doduerch, datt ech net vun der Bedingung ofwäiche wollt, datt de Projet e pure Frontend bleift, ouni Backend. Natierlech wier déi einfachst Léisung d'Nodejs opzezéien an ze zwéngen fir en Archiv mat Konfiguratiounen ze generéieren mat direkte Linken.
Eigentlech waren et net vill Méiglechkeeten. Méi präzis koum nëmmen een an de Kapp. Mir mussen d'Konfiguratioun opsetzen an e Link kréien, dee mir op d'Serverkonsole kopéiere kënnen fir en Zip-Archiv ze kréien.
Verschidde Textdateien am resultéierende Zip-Archiv hunn zimmlech e bësse gewien, wuertwiertlech e puer Kilobytes. Déi offensichtlech Léisung war d'Base64 String aus dem generéierten Zip-Archiv ze kréien an en an de Puffer ze werfen, wärend um Server mam Kommando an der Konsole
echo 'base64string' | base64 --decode > config.zip
mir kéinten déi selwecht Zip-Datei erstellen.
An de Projet Ressourcen gesi mir eng Method fir en Zip-Archiv ze generéieren:
$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',
});
};
alles ass ganz einfach, mat der Bibliothéik
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
wou Inhalt de resultéierende Blobobjekt vum Zip-Archiv ass.
Ok, alles wat ech maache muss war en anere Knäppchen niewendrun derbäi a wann ech drop geklickt hunn, géif ech dat resultéierend Zip-Archiv net an de Browser späicheren, awer de Base64 Code dovunner kréien. Nodeems ech e bëssen ëmgedréint hunn, krut ech 2 Methoden, amplaz nëmmen een DownloadZip:
$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',
});
};
Wéi Dir vläicht gemierkt hutt, hunn ech d'Generatioun vum Zip-Archiv selwer op d'private GenerateZip Method geplënnert, a sou weider. Dëst ass AngularJS, an den Auteur selwer hält sech un Callbacks an huet et net duerch Verspriechen ëmgesat. downloadZip huet nach ëmmer SaveAs als Ausgang gemaach, wärend den DownloadBase64 eppes liicht anescht gemaach huet. Mir erstellen e FileReader Objet deen eis an html5 komm ass a scho ganz ass
position: absolute;
z-index: -1;
opacity: 0;
wat mir erlaabt huet souwuel d'Element aus der Siicht ze verstoppen an et tatsächlech op der Säit ze loossen. Voila, d'Aufgab war ofgeschloss, wéi ech op mäi Knäppchen geklickt hunn, gouf eng Zeil wéi dës an de Puffer gesat:
echo 'base64string' | base64 --decode > config.zip
déi ech einfach an d'Konsole um Server gepecht hunn an direkt en Zip-Archiv mat all de Configuratioune krut.
An natierlech hunn ech den Auteur eng Pull-Ufro geschéckt, well ... de Projet ass aktiv a lieweg, ech géif gären Updates vum Auteur gesinn an hunn en eegene Knäppchen) Fir déi interesséiert, hei ass et
Glécklech Entwécklung jiddereen)
Source: will.com