Sveikinimai, bendražygiai. Gražus mano kovos serveriuose
Draugai paprašė, kad įkurčiau jiems vystymo ūkį, ir užuot tempęs jiems savo konkrečius šablonus, prisiminiau įdomų projektą
Žinoma, prieš gilindamasis į šaltinius, pažiūrėjau, kur Chrome ištraukia sugeneruotą zip archyvą su konfigūracijomis, o ten manęs laukė adresas, prasidedantis "blob:", oi. Jau tapo aišku, kad paslauga nieko negeneruoja, iš tikrųjų visa tai daro js. Iš tiesų, zip archyvą sukuria pats klientas, naršyklė ir javascript. Tie. grožis tame, kad projektas
Pradėjęs projektą, pradėjau galvoti, kokios yra mano galimybės. Užduotį apsunkino tai, kad nenorėjau nukrypti nuo sąlygos, kad projektas liktų grynas front-end, be jokio back-end. Žinoma, paprasčiausias sprendimas būtų ištraukti nodejus ir priversti jį generuoti archyvą su konfigūracijomis naudojant tiesiogines nuorodas.
Tiesą sakant, nebuvo daug pasirinkimų. Tiksliau, į galvą atėjo tik vienas. Turime nustatyti konfigūracijas ir gauti nuorodą, kurią galime nukopijuoti į serverio konsolę, kad gautume ZIP archyvą.
Keli tekstiniai failai gautame zip archyve svėrė gana mažai, tiesiogine prasme kelis kilobaitus. Akivaizdus sprendimas buvo gauti base64 eilutę iš sugeneruoto zip archyvo ir įmesti į buferį serveryje su komanda konsolėje
echo 'base64string' | base64 --decode > config.zip
galime sukurti tą patį zip failą.
Projekto šaltiniuose matome ZIP archyvo generavimo metodą:
$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',
});
};
viskas yra gana paprasta, naudojant biblioteką
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
kur turinys yra gautas ZIP archyvo blob objektas.
Ok, tereikėjo prie jo pridėti dar vieną mygtuką ir jį paspaudus neišsaugočiau gauto zip archyvo į naršyklę, o gaučiau iš jo base64 kodą. Šiek tiek pasvarsčius, gavau 2 metodus, o ne vieną 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',
});
};
Kaip tikriausiai pastebėjote, aš perkėliau patį ZIP archyvo generavimą į privatų generavimoZip metodą ir pan. Tai AngularJS, o pats autorius laikosi atsišaukimų ir pažadais to neįgyvendino. „downloadZip“ vis tiek išsaugojo „SaveAs“ kaip išvestį, o „downloadBase64“ padarė šiek tiek kitaip. Mes sukuriame FileReader objektą, kuris atėjo pas mus html5 ir jau yra gana
position: absolute;
z-index: -1;
opacity: 0;
Tai leido man paslėpti elementą ir palikti jį puslapyje. Voila, užduotis buvo atlikta, kai paspaudžiau savo mygtuką, buferyje buvo įdėta tokia eilutė:
echo 'base64string' | base64 --decode > config.zip
kurį tiesiog įklijavau į pultą serveryje ir iškart gavau zip archyvą su visomis konfigūracijomis.
Ir, žinoma, nusiunčiau autoriui prašymą ištraukti, nes... projektas aktyvus ir gyvas, noreciau pamatyti autoriaus atnaujinimus ir tureti savo mygtuka) Tiems, kurie domisi, cia
Linksmo vystymosi visiems)
Šaltinis: www.habr.com