Сәлеметсіздер ме, жолдастар. Менің жауынгерлік серверлерімде әдемі
Достарым маған олар үшін даму фермасын құруды өтінді, мен оларға өз үлгілерімді сүйреп апарудың орнына қызықты жоба есіме түсті.
Әрине, дереккөздерді зерттемес бұрын, мен Chrome құрастырылған zip мұрағатын конфигурациялармен қай жерде шығаратынын қарадым, сонда мені «blob:» деп басталатын мекенжай күтіп тұрды, ау. Қызмет жол бойында ештеңе жасамайтыны белгілі болды, іс жүзінде мұның бәрін JS жасайды. Шынында да, zip мұрағатын клиент, браузер және JavaScript өзі жасайды. Анау. сұлулық сол жоба
Жобаны аяқтағаннан кейін мен өзімнің нұсқаларым туралы ойлана бастадым. Тапсырманы қиындатып жібердім, себебі мен жобаның ешқандай артқы жағы жоқ, таза фронтальды болып қалуы керек деген шарттан ауытқығым келмеді. Әрине, ең қарапайым шешім түйіндерді шығарып, оны тікелей сілтемелерді пайдаланып конфигурациялары бар мұрағатты құруға мәжбүрлеу болады.
Шындығында, көптеген нұсқалар болған жоқ. Дәлірек айтсақ, есіме біреу ғана түсті. Біз конфигурацияларды орнатуымыз керек және 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 мұрағатының генерациясын жеке generZip әдісіне ауыстырдым және т.б. Бұл AngularJS және автордың өзі кері қоңырауларды ұстанады және оны уәделер арқылы жүзеге асырмады. downloadZip әлі де шығыс ретінде saveA жасады, ал downloadBase64 сәл басқаша әрекет жасады. Біз html5-те бізге келген FileReader нысанын жасаймыз және қазірдің өзінде бар
position: absolute;
z-index: -1;
opacity: 0;
бұл элементті көріністен жасыруға және оны бетте қалдыруға мүмкіндік берді. Voila, тапсырма орындалды, мен түймені басқан кезде буферге келесідей жол орналастырылды:
echo 'base64string' | base64 --decode > config.zip
Мен оны жай ғана сервердегі консольге қойдым және бірден барлық конфигурациялары бар zip мұрағатын алдым.
Және, әрине, мен авторға тарту сұрауын жібердім, өйткені... жоба белсенді және жанды, мен автордан жаңартуларды көргім келеді және өзімнің түймем бар) Қызығушылық танытқандар үшін бұл
Бақытты даму баршаңызға)
Ақпарат көзі: www.habr.com