Groetnis, kameraden. Moai op myn combat tsjinners
Freonen fregen my om in ûntwikkelingsbuorkerij foar har op te setten, en ynstee fan myn spesifike sjabloanen te slepen, tocht ik oan in nijsgjirrich projekt
Fansels, foardat ik yn 'e boarnen grave, seach ik nei wêr't Chrome it generearre zip-argyf mei konfiguraasjes lûkt, en dêr wachte in adres begjinnend mei "blob:" op my, oeps. It is al dúdlik wurden dat de tsjinst ûnderweis neat genereart, yn feite wurdt it allegear dien troch js. Ja, it zip-argyf wurdt generearre troch de kliïnt, browser en javascript sels. Dy. de skientme is dat it projekt
Nei it forkearjen fan it projekt begon ik te tinken oer wat myn opsjes wiene. De opjefte waard yngewikkeld troch it feit dat ik net ôfwykje woe fan de betingst dat it projekt in suver front-end bliuwe soe, sûnder in efterkant. Fansels soe de ienfâldichste oplossing wêze om nodejs op te lûken en it te twingen om in argyf te generearjen mei konfiguraasjes mei direkte keppelings.
Eins wiene d'r net folle opsjes. Mear krekter kaam der mar ien yn 't sin. Wy moatte de konfiguraasjes ynstelle en in keppeling krije dy't wy kinne kopiearje nei de serverkonsole om in zip-argyf te krijen.
Ferskate tekstbestannen yn it resultearjende zip-argyf weagen nochal wat, letterlik in pear kilobytes. De foar de hân lizzende oplossing wie om de base64-string te krijen fan it generearre zip-argyf en it yn 'e buffer te smiten, wylst op' e server mei it kommando yn 'e konsole
echo 'base64string' | base64 --decode > config.zip
wy kinne itselde zip-bestân oanmeitsje.
Yn 'e projektboarnen sjogge wy in metoade foar it generearjen fan in zip-argyf:
$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 is frij simpel, mei help fan de bibleteek
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
wêryn ynhâld it resultearjende blobobjekt is fan it zip-argyf.
Ok, alles wat ik moast dwaan wie in oare knop njonken it tafoegje en as ik derop klikte, soe ik it resultearjende zip-argyf net opslaan yn 'e browser, mar de base64-koade derfan krije. Nei't ik in bytsje omsloech, krige ik 2 metoaden, ynstee fan mar ien 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',
});
};
Lykas jo miskien hawwe opfallen, haw ik de generaasje fan it zip-argyf sels ferpleatst nei de privee generearjeZip-metoade, ensfh. Dit is AngularJS, en de auteur sels hâldt fêst oan callbacks en hat it net útfierd troch beloften. downloadZip die noch saveAs as útfier, wylst downloadBase64 wat oars die. Wy meitsje in FileReader-objekt dat by ús kaam yn html5 en is al hielendal
position: absolute;
z-index: -1;
opacity: 0;
wêrtroch't ik it elemint foar it sicht ferbergje koe en it eins op 'e side litte litte. Voila, de taak wie foltôge, doe't ik op myn knop klikte, waard in rigel lykas dizze yn 'e buffer pleatst:
echo 'base64string' | base64 --decode > config.zip
dy't ik gewoan yn 'e konsole op 'e tsjinner plakke en fuortendaliks in zip-argyf krige mei alle konfiguraasjes.
En fansels haw ik in pull-fersyk nei de skriuwer stjoerd, om't ... it projekt is aktyf en libbendich, ik soe graach updates fan de skriuwer sjen wolle en myn eigen knop hawwe) Foar belangstellenden, hjir is it
Lokkige ûntwikkeling elkenien)
Boarne: www.habr.com