Hilsen, kamerater. Vakkert på mine kampservere
Venner ba meg sette opp en utviklingsgård for dem, og i stedet for å dra dem mine spesifikke maler, husket jeg et interessant prosjekt
Selvfølgelig, før jeg gravde i kildene, så jeg på hvor Chrome henter det genererte zip-arkivet med konfigurasjoner, og der ventet en adresse som startet med "blob:" på meg, ups. Det har allerede blitt klart at tjenesten ikke genererer noe underveis, faktisk er det hele gjort av js. Faktisk er zip-arkivet generert av klienten, nettleseren og javascriptet selv. De. det fine er at prosjektet
Etter å ha forkastet prosjektet, begynte jeg å tenke på hva alternativene mine var. Oppgaven ble komplisert av at jeg ikke ønsket å fravike vilkåret om at prosjektet skulle forbli en ren front-end, uten noen back-end. Selvfølgelig ville den enkleste løsningen være å trekke opp nodejs og tvinge den til å generere et arkiv med konfigurasjoner ved å bruke direkte lenker.
Egentlig var det ikke mange alternativer. Mer presist kom bare én til tankene. Vi må sette opp konfigurasjonene og få en lenke som vi kan kopiere til serverkonsollen for å få et zip-arkiv.
Flere tekstfiler i det resulterende zip-arkivet veide ganske mye, bokstavelig talt noen få kilobyte. Den åpenbare løsningen var å hente base64-strengen fra det genererte zip-arkivet og kaste den inn i bufferen mens du var på serveren med kommandoen i konsollen
echo 'base64string' | base64 --decode > config.zip
vi kunne lage den samme zip-filen.
I prosjektressursene ser vi en metode for å generere et zip-arkiv:
$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',
});
};
alt er ganske enkelt, ved å bruke biblioteket
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
der innholdet er det resulterende blob-objektet i zip-arkivet.
Ok, alt jeg måtte gjøre var å legge til en annen knapp ved siden av den, og når jeg klikket på den, ville jeg ikke lagre det resulterende zip-arkivet i nettleseren, men hente base64-koden fra den. Etter å ha rotet litt, fikk jeg 2 metoder, i stedet for bare én 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',
});
};
Som du kanskje har lagt merke til, flyttet jeg generasjonen av selve zip-arkivet til den private genererZip-metoden, og så videre. Dette er AngularJS, og forfatteren selv holder seg til tilbakeringinger og implementerte det ikke gjennom løfter. downloadZip gjorde fortsatt saveAs som en utgang, mens downloadBase64 gjorde noe litt annerledes. Vi lager et FileReader-objekt som kom til oss i html5 og som allerede er ganske
position: absolute;
z-index: -1;
opacity: 0;
som gjorde at jeg både kunne skjule elementet og faktisk la det ligge på siden. Voila, oppgaven ble fullført, da jeg klikket på knappen min ble en linje som denne plassert i bufferen:
echo 'base64string' | base64 --decode > config.zip
som jeg bare limte inn i konsollen på serveren og umiddelbart mottok et zip-arkiv med alle konfigurasjonene.
Og selvfølgelig sendte jeg en pull-forespørsel til forfatteren, fordi... prosjektet er aktivt og livlig, jeg vil gjerne se oppdateringer fra forfatteren og ha min egen knapp) For de som er interessert, her er den
God utvikling alle sammen)
Kilde: www.habr.com