Assalomu alaykum, o'rtoqlar. Mening jangovar serverlarimda chiroyli
Do'stlar mendan ular uchun rivojlanish fermasini tashkil etishimni so'rashdi va ularga o'zimning maxsus shablonlarimni sudrab borish o'rniga, men qiziqarli loyihani esladim.
Albatta, manbalarni o'rganishdan oldin, men Chrome yaratilgan zip arxivini konfiguratsiyalar bilan qayerga tortayotganini ko'rib chiqdim va u erda "blob:" bilan boshlanadigan manzil meni kutayotgan edi. Xizmat yo'lda hech narsa yaratmasligi allaqachon ma'lum bo'ldi, aslida hammasi JS tomonidan amalga oshiriladi. Haqiqatan ham, zip arxivi mijoz, brauzer va javascriptning o'zi tomonidan yaratilgan. Bular. loyihaning go'zalligi shundaki
Loyihani bekor qilgandan so'ng, men qanday variantlar borligi haqida o'ylay boshladim. Vazifa murakkablashdi, chunki men loyiha hech qanday orqa tomonsiz, sof front-end bo'lib qolishi shartidan chetga chiqishni xohlamadim. Albatta, eng oddiy yechim nodej-larni tortib olish va uni to'g'ridan-to'g'ri havolalar yordamida konfiguratsiyalar bilan arxiv yaratishga majbur qilishdir.
Aslida, ko'p variantlar yo'q edi. Aniqrog'i, faqat bittasi esga tushdi. Biz konfiguratsiyalarni o'rnatishimiz va zip arxivini olish uchun server konsoliga nusxalashimiz mumkin bo'lgan havolani olishimiz kerak.
Natijada paydo bo'lgan zip arxividagi bir nechta matnli fayllar biroz og'irlikda, tom ma'noda bir necha kilobayt edi. Aniq yechim yaratilgan zip arxividan base64 satrini olish va konsoldagi buyruq bilan serverda bo'lganda uni buferga tashlash edi.
echo 'base64string' | base64 --decode > config.zip
biz xuddi shu zip faylni yaratishimiz mumkin.
Loyiha resurslarida biz zip arxivini yaratish usulini ko'ramiz:
$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',
});
};
hamma narsa juda oddiy, kutubxona yordamida
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
bu erda kontent zip arxivining hosil bo'lgan blob ob'ektidir.
OK, men qilishim kerak bo'lgan narsa uning yoniga boshqa tugmani qo'shish edi va men uni bosganimda, natijada olingan zip arxivini brauzerga saqlamayman, lekin undan base64 kodini olaman. Biroz ovora bo'lganimdan so'ng, men bitta downloadZip o'rniga ikkita usulni oldim:
$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',
});
};
E'tibor bergan bo'lsangiz kerak, men zip arxivining avlodini xususiy GenereZip usuliga o'tkazdim va hokazo. Bu AngularJS va muallifning o'zi qayta qo'ng'iroqlarga sodiq qoladi va uni va'dalar orqali amalga oshirmagan. downloadZip hali ham saveA ni chiqish sifatida bajardi, downloadBase64 esa biroz boshqacha ish qildi. Biz html5 da bizga kelgan va allaqachon to'liq bo'lgan FileReader ob'ektini yaratamiz
position: absolute;
z-index: -1;
opacity: 0;
Bu menga elementni ko'zdan yashirish va uni sahifada qoldirish imkonini berdi. Voila, vazifa bajarildi, men tugmani bosganimda, buferga shunday qator qo'yildi:
echo 'base64string' | base64 --decode > config.zip
Men shunchaki serverdagi konsolga joylashtirdim va darhol barcha konfiguratsiyalar bilan zip arxivini oldim.
Va, albatta, men muallifga tortishish so'rovini yubordim, chunki ... loyiha faol va jonli, men muallifdan yangilanishlarni ko'rishni va o'zimning tugmachamga ega bo'lishni xohlayman) Qiziqqanlar uchun bu erda
Hammaga omadli rivojlanish)
Manba: www.habr.com