ΠΠΎΠ·Π΄ΡΠ°Π², Π΄ΡΡΠ³Π°ΡΠΈ. ΠΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ Π½Π° ΠΌΠΎΠΈΡΠ΅ Π±ΠΎΡΠ±Π΅Π½ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΈ
ΠΡΠΈΡΠ°ΡΠ΅Π»ΠΈΡΠ΅ ΠΌΠ΅ Π·Π°ΠΌΠΎΠ»ΠΈΡΠ° Π΄Π° ΠΈΠΌ ΠΏΠΎΡΡΠ°Π²Π°ΠΌ ΡΠ°Π·Π²ΠΎΡΠ½Π° ΡΠ°ΡΠΌΠ° ΠΈ Π½Π°ΠΌΠ΅ΡΡΠΎ Π΄Π° ΠΈΠΌ Π³ΠΈ Π²Π»Π΅ΡΠ°ΠΌ ΠΌΠΎΠΈΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈ, ΡΠ΅ ΡΠ΅ΡΠΈΠ² Π½Π° Π΅Π΄Π΅Π½ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ
Π‘Π΅ ΡΠ°Π·Π±ΠΈΡΠ°, ΠΏΡΠ΅Π΄ Π΄Π° ΠΊΠΎΠΏΠ°ΠΌ Π²ΠΎ ΠΈΠ·Π²ΠΎΡΠΈΡΠ΅, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Π² ΠΊΠ°Π΄Π΅ Chrome ΡΠ° Π²Π»Π΅ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π°ΡΠ° Π·ΠΈΠΏ Π°ΡΡ
ΠΈΠ²Π° ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π° ΡΠ°ΠΌΡ ΠΌΠ΅ ΡΠ΅ΠΊΠ°ΡΠ΅ Π°Π΄ΡΠ΅ΡΠ°ΡΠ° ΡΡΠΎ ΠΏΠΎΡΠ½ΡΠ²Π° ΡΠΎ βblob:β, ΠΎΠΏΠ°. ΠΠ΅ΡΠ΅ ΡΡΠ°Π½Π° ΡΠ°ΡΠ½ΠΎ Π΄Π΅ΠΊΠ° ΡΡΠ»ΡΠ³Π°ΡΠ° Π½Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π½ΠΈΡΡΠΎ Π½Π° ΠΏΠ°ΡΠΎΡ, Π²ΡΡΡΠ½ΠΎΡΡ, ΡΠ΅ΡΠΎ ΡΠΎΠ° Π³ΠΎ ΠΏΡΠ°Π²ΠΈ js. ΠΠ°Π²ΠΈΡΡΠΈΠ½Π°, Π·ΠΈΠΏ Π°ΡΡ
ΠΈΠ²Π°ΡΠ° Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π° ΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ, ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ ΠΈ ΡΠ°ΠΌΠΈΠΎΡ javascript. ΠΠ½ΠΈΠ΅. ΡΠ±Π°Π²ΠΈΠ½Π°ΡΠ° Π΅ Π²ΠΎ ΡΠΎΠ° ΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ
ΠΡΠΊΠ°ΠΊΠΎ Π³ΠΎ Π·Π°Π²ΡΡΠΈΠ² ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ, ΠΏΠΎΡΠ½Π°Π² Π΄Π° ΡΠ°Π·ΠΌΠΈΡΠ»ΡΠ²Π°ΠΌ ΠΊΠΎΠΈ ΡΠ΅ ΠΌΠΎΠΈΡΠ΅ ΠΎΠΏΡΠΈΠΈ. ΠΠ°Π΄Π°ΡΠ°ΡΠ° Π±Π΅ΡΠ΅ ΠΊΠΎΠΌΠΏΠ»ΠΈΡΠΈΡΠ°Π½Π° ΠΎΠ΄ ΡΠΎΠ° ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊΠ°Π² Π΄Π° ΠΎΡΡΡΠ°ΠΏΠ°ΠΌ ΠΎΠ΄ ΡΡΠ»ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ Π΄Π° ΠΎΡΡΠ°Π½Π΅ ΡΠΈΡΡ ΡΡΠΎΠ½Ρ-Π΅Π½Π΄, Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠΎΠ² Π±Π΅ΠΊ-Π΅Π½Π΄. Π‘Π΅ ΡΠ°Π·Π±ΠΈΡΠ°, Π½Π°ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²Π»Π΅ΡΠ°Ρ nodejs ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ½ΡΠ΄Π°Ρ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° Π°ΡΡ
ΠΈΠ²Π° ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΈ Π²ΡΡΠΊΠΈ.
ΠΡΡΡΠ½ΠΎΡΡ, Π½Π΅ΠΌΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΠΎΠΏΡΠΈΠΈ. ΠΠΎΡΠΎΡΠ½ΠΎ, ΡΠ°ΠΌΠΎ Π΅Π΄Π΅Π½ ΠΌΠΈ ΠΏΠ°Π΄Π½Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ. Π’ΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅ ΠΈ Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ Π²ΡΡΠΊΠ° ΡΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡΠΊΠ°ΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π° Π·Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ Π·ΠΈΠΏ Π°ΡΡ
ΠΈΠ²Π°.
ΠΠ΅ΠΊΠΎΠ»ΠΊΡ ΡΠ΅ΠΊΡΡΡΠ°Π»Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π²ΠΎ Π΄ΠΎΠ±ΠΈΠ΅Π½Π°ΡΠ° Π·ΠΈΠΏ Π°ΡΡ
ΠΈΠ²Π° ΡΠ΅ΠΆΠ΅Π° ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΠΌΠ°Π»ΠΊΡ, Π±ΡΠΊΠ²Π°Π»Π½ΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΊΠΈΠ»ΠΎΠ±Π°ΡΡΠΈ. ΠΡΠΈΠ³Π»Π΅Π΄Π½ΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±Π΅ΡΠ΅ Π΄Π° ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ Π½ΠΈΠ·Π°ΡΠ° base64 ΠΎΠ΄ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π°ΡΠ° zip Π°ΡΡ
ΠΈΠ²Π° ΠΈ Π΄Π° ΡΠ΅ ΡΡΠ»ΠΈ Π²ΠΎ Π±Π°ΡΠ΅ΡΠΎΡ, Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π²ΠΎ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°
echo 'base64string' | base64 --decode > config.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');
ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°ΡΠ° Π΅ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠ΄ ΡΠΈΠΏ Π°ΡΡ ΠΈΠ²Π°ΡΠ°.
ΠΠΊ, ΡΓ¨ ΡΡΠΎ ΡΡΠ΅Π±Π°ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²Π°ΠΌ Π΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ ΡΡΡΠ΅ Π΅Π΄Π½ΠΎ ΠΊΠΎΠΏΡΠ΅ Π΄ΠΎ Π½Π΅Π³ΠΎ ΠΈ ΠΊΠΎΠ³Π° ΡΠ΅ ΠΊΠ»ΠΈΠΊΠ½Π°ΠΌ Π½Π° Π½Π΅Π³ΠΎ, Π½Π΅ΠΌΠ° Π΄Π° ΡΠ° Π·Π°ΡΡΠ²Π°ΠΌ Π΄ΠΎΠ±ΠΈΠ΅Π½Π°ΡΠ° ΠΏΠΎΡΡΠ΅Π½ΡΠΊΠ° Π°ΡΡ ΠΈΠ²Π° Π²ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ, ΡΡΠΊΡ Π΄Π° Π³ΠΎ Π·Π΅ΠΌΠ°ΠΌ ΠΊΠΎΠ΄ΠΎΡ base64 ΠΎΠ΄ Π½Π΅Π³ΠΎ. ΠΡΠΊΠ°ΠΊΠΎ ΠΌΠ°Π»ΠΊΡ ΡΠ΅ Π·Π°ΡΡΠΊΠ°Π²Π°Π², Π΄ΠΎΠ±ΠΈΠ² 2 ΠΌΠ΅ΡΠΎΠ΄ΠΈ, Π½Π°ΠΌΠ΅ΡΡΠΎ ΡΠ°ΠΌΠΎ Π΅Π΄Π½ΠΎ ΠΏΡΠ΅Π·Π΅ΠΌΠ°ΡΠ΅ Zip:
$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',
});
};
ΠΠ°ΠΊΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Π±ΠΈ Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π²ΡΠ΅, ΡΠ° ΠΏΡΠ΅ΡΡΠ»ΠΈΠ² Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΡΠ°ΠΌΠ°ΡΠ° Π·ΠΈΠΏ Π°ΡΡ
ΠΈΠ²Π° Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΎΡ ΠΏΡΠΈΠ²Π°ΡΠ΅Π½ generateZip ΠΈΡΠ½. ΠΠ²Π° Π΅ AngularJS, Π° ΡΠ°ΠΌΠΈΠΎΡ Π°Π²ΡΠΎΡ ΡΠ΅ Π΄ΡΠΆΠΈ Π΄ΠΎ ΠΏΠΎΠ²ΠΈΡΠΈΡΠ΅ ΠΈ Π½Π΅ Π³ΠΎ ΡΠΏΡΠΎΠ²Π΅Π΄Π΅ ΠΏΡΠ΅ΠΊΡ Π²Π΅ΡΡΠ²Π°ΡΠ°. downloadZip ΡΠ΅ΠΏΠ°ΠΊ Π½Π°ΠΏΡΠ°Π²ΠΈ saveAs ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π»Π΅Π·, Π΄ΠΎΠ΄Π΅ΠΊΠ° downloadBase64 Π½Π°ΠΏΡΠ°Π²ΠΈ Π½Π΅ΡΡΠΎ ΠΌΠ°Π»ΠΊΡ ΠΏΠΎΠΈΠ½Π°ΠΊΡ. ΠΠΈΠ΅ ΠΊΡΠ΅ΠΈΡΠ°ΠΌΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡ FileReader ΠΊΠΎΡ Π½ΠΈ Π΄ΠΎΡΠ΄Π΅ Π²ΠΎ html5 ΠΈ Π²Π΅ΡΠ΅ Π΅ Π΄ΠΎΡΡΠ°
position: absolute;
z-index: -1;
opacity: 0;
ΡΡΠΎ ΠΌΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ ΠΈ Π΄Π° Π³ΠΎ ΡΠΎΠΊΡΠΈΡΠ°ΠΌ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΎΡ ΠΎΠ΄ ΠΏΠΎΠ³Π»Π΅Π΄ ΠΈ Π²ΡΡΡΠ½ΠΎΡΡ Π΄Π° Π³ΠΎ ΠΎΡΡΠ°Π²Π°ΠΌ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°. Voila, Π·Π°Π΄Π°ΡΠ°ΡΠ° Π±Π΅ΡΠ΅ Π·Π°Π²ΡΡΠ΅Π½Π°, ΠΊΠΎΠ³Π° ΠΊΠ»ΠΈΠΊΠ½Π°Π² Π½Π° ΠΌΠΎΠ΅ΡΠΎ ΠΊΠΎΠΏΡΠ΅, Π²ΠΎ Π±Π°ΡΠ΅ΡΠΎΡ Π±Π΅ΡΠ΅ ΡΡΠ°Π²Π΅Π½Π° Π²Π°ΠΊΠ²Π° Π»ΠΈΠ½ΠΈΡΠ°:
echo 'base64string' | base64 --decode > config.zip
ΡΡΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π³ΠΎ Π·Π°Π»Π΅ΠΏΠΈΠ² Π²ΠΎ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ ΠΈ Π²Π΅Π΄Π½Π°Ρ Π΄ΠΎΠ±ΠΈΠ² Π·ΠΈΠΏ Π°ΡΡ
ΠΈΠ²Π° ΡΠΎ ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
Π, ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°, ΠΈΡΠΏΡΠ°ΡΠΈΠ² Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡΠ²Π°ΡΠ΅ Π΄ΠΎ Π°Π²ΡΠΎΡΠΎΡ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ... ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ Π΅ Π°ΠΊΡΠΈΠ²Π΅Π½ ΠΈ ΠΆΠΈΠ², Π±ΠΈ ΡΠ°ΠΊΠ°Π» Π΄Π° Π²ΠΈΠ΄Π°ΠΌ Π°ΠΆΡΡΠΈΡΠ°ΡΠ° ΠΎΠ΄ Π°Π²ΡΠΎΡΠΎΡ ΠΈ Π΄Π° ΠΈΠΌΠ°ΠΌ ΡΠ²ΠΎΠ΅ ΠΊΠΎΠΏΡΠ΅) ΠΠ° Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ°Π½ΠΈΡΠ΅, Π΅Π²Π΅ Π³ΠΎ
Π‘ΡΠ΅ΡΠ΅Π½ ΡΠ°Π·Π²ΠΎΡ Π½Π° ΡΠΈΡΠ΅)
ΠΠ·Π²ΠΎΡ: www.habr.com