Саламатсыздарбы, жолдоштор. Менин согуштук серверлеримде сулуу
Досторум менден алар үчүн өнүктүрүү фермасын түзүүнү суранышты жана аларга менин атайын шаблондорумду сүйрөп баргандын ордуна, мен кызыктуу долбоорду эстедим.
Албетте, булактарды казуудан мурун, мен Chrome конфигурациялары менен түзүлгөн zip архивин каякка тартаарын карадым, ал жерде мени "blob:" менен башталган дарек күтүп турган, ой. Кызмат жолдо эч нерсе жаратпагандыгы айкын болду, чындыгында мунун бардыгы js тарабынан жасалат. Чынында эле, zip архиви кардар, браузер жана JavaScript өзү тарабынан түзүлөт. Ошол. сулуулук бул долбоор болуп саналат
Долбоорду айрыгандан кийин мен кандай варианттар бар экенин ойлоно баштадым. Долбоор эч кандай арткы чексиз, таза алдыңкы план бойдон калуусу керек деген шарттан тайгым келбегендиктен тапшырма татаал болду. Албетте, эң жөнөкөй чечим - бул nodejs файлдарын чыгарып, аны түз шилтемелерди колдонуп конфигурациялары бар архивди түзүүгө мажбурлоо.
Чынында, көп варианттар болгон эмес. Тагыраак айтканда, бирөө гана ойго келди. Конфигурацияларды орнотуп, zip архивин алуу үчүн сервер консолуна көчүрө турган шилтемени алышыбыз керек.
Пайда болгон zip архивдеги бир нече текст файлдары бир аз, түз маанисинде бир нече килобайт болгон. Ачык чечим - түзүлгөн zip архивинен base64 сапты алуу жана аны буферге ыргытуу, консолдогу буйрук менен серверде
echo 'base64string' | base64 --decode > config.zip
биз ушул эле zip файлды түзө алабыз.
Долбоордун ресурстарында биз zip архивин түзүү ыкмасын көрөбүз:
$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',
});
};
баары абдан жөнөкөй, китепкананы колдонуу
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
бул жерде мазмун zip архивинин натыйжадагы blob объектиси болуп саналат.
Макул, мен анын жанына дагы бир баскычты кошушум керек болчу жана мен аны басканда, натыйжада zip архивин браузерге сактабайм, бирок андан base64 кодун алмакмын. Бир аз убара тартып, мен бир эле downloadZipдин ордуна 2 ыкмага ээ болдум:
$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',
});
};
Сиз байкагандырсыз, мен zip архивинин муунунун өзүн privategenerZip ыкмасына жылдырдым ж.б.у.с. Бул AngularJS, жана автор өзү кайра чалууларды карманып, аны убадалар аркылуу ишке ашырган эмес. downloadZip дагы эле saveAs чыгарды, ал эми downloadBase64 бир аз башкача кылды. Биз html5те бизге келген FileReader объектин түзөбүз жана буга чейин эле
position: absolute;
z-index: -1;
opacity: 0;
бул мага элементти көрүүдөн жашырууга жана аны баракта калтырууга мүмкүнчүлүк берди. Voila, тапшырма аткарылды, мен баскычымды басканымда буферге мындай сызык жайгаштырылган:
echo 'base64string' | base64 --decode > config.zip
Мен жөн гана сервердеги консолго чаптап, дароо бардык конфигурациялары менен zip архивин алдым.
Анан, албетте, мен авторго тартуу өтүнүчүн жөнөттүм, анткени... долбоор активдүү жана жандуу, мен автордон жаңыртууларды көргүм келет жана өзүмдүн баскычым бар) Кызыккандар үчүн бул жерде
Баарынарга ийгилик)
Source: www.habr.com