Поздрав, другови. Прелепо на мојим борбеним серверима
Пријатељи су ме замолили да им поставим развојну фарму и уместо да им вучем своје специфичне шаблоне, сетио сам се занимљивог пројекта
Наравно, пре него што сам копао по изворима, погледао сам где Цхроме повлачи генерисану зип архиву са конфигурацијама, а тамо ме је чекала адреса која почиње са „блоб:“, упс. Већ је постало јасно да услуга успут ништа не генерише, у ствари, све то ради јс. Заиста, зип архиву генерише сам клијент, претраживач и јавасцрипт. Оне. лепота је у томе што пројекат
Након што сам одвојио пројекат, почео сам да размишљам о томе које су моје опције. Задатак је био компликован чињеницом да нисам желео да одступим од услова да пројекат остане чист фронт-енд, без икаквог бацк-енда. Наравно, најједноставније решење би било да подигнете нодејс и натерате га да генерише архиву са конфигурацијама користећи директне везе.
У ствари, није било много опција. Тачније, само један ми је пао на памет. Морамо да подесимо конфигурације и добијемо везу коју можемо да копирамо на конзолу сервера да бисмо добили зип архиву.
Неколико текстуалних датотека у резултујућој зип архиви тежило је прилично, буквално неколико килобајта. Очигледно решење је било да добијете басе64 стринг из генерисане зип архиве и баците га у бафер, док сте на серверу са командом у конзоли
echo 'base64string' | base64 --decode > config.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');
где је садржај резултујући блоб објекат зип архиве.
Ок, све што је требало да урадим је да додам још једно дугме поред њега и када бих кликнуо на њега, не бих сачувао резултујућу зип архиву у претраживачу, већ бих преузео басе64 код из ње. Након што сам се мало петљао, добио сам 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',
});
};
Као што сте можда приметили, преместио сам генерисање саме зип архиве у приватни генезип метод и тако даље. Ово је АнгуларЈС, а сам аутор се држи повратних позива и није га имплементирао кроз обећања. довнлоадЗип је и даље сачувао као излаз, док је довнлоадБасе64 урадио нешто мало другачије. Креирамо ФилеРеадер објекат који нам је дошао у хтмл5 и већ је прилично
position: absolute;
z-index: -1;
opacity: 0;
што ми је омогућило да сакријем елемент од погледа и да га заправо оставим на страници. Воила, задатак је завршен, када сам кликнуо на своје дугме, у бафер је постављена оваква линија:
echo 'base64string' | base64 --decode > config.zip
коју сам једноставно залепио у конзолу на серверу и одмах добио зип архиву са свим конфигурацијама.
И, наравно, послао сам захтев за повлачење аутору, јер... пројекат је активан и живахан, волео бих да видим ажурирања од аутора и да имам своје дугме) За заинтересоване, ево га
Срећан развој свима)
Извор: ввв.хабр.цом