ΠΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡ, ΡΠΎΠ²Π°ΡΠΈΡΠΈ. ΠΠ° ΠΌΠΎΠΈΡ
Π±ΠΎΠ΅Π²ΡΡ
ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ
ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΡΠΉ
ΠΡΡΠ·ΡΡ ΠΏΠΎΠΏΡΠΎΡΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π½ΡΡΡ ΠΈΠΌ Π΄Π΅Π²Π΅Π»ΠΎΠΏΠ΅ΡΡΠΊΡΡ ΡΠ΅ΡΠΌΡ ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ°ΡΠΈΡΡ ΠΈΠΌ ΡΠ²ΠΎΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ, Ρ Π²ΡΠΏΠΎΠΌΠ½ΠΈΠ» ΠΏΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΊΠΎΠ²ΡΡΡΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ, Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π» ΠΎΡΠΊΡΠ΄Π° Ρ
ΡΠΎΠΌ ΡΡΠ½Π΅Ρ ΡΠ³Π΅Π½Π΅ΡΠ΅Π½Π½ΡΠΉ zip Π°ΡΡ
ΠΈΠ² Ρ ΠΊΠΎΠ½ΡΠΈΠ³Π°ΠΌΠΈ, Π° ΡΠ°ΠΌ ΠΌΠ΅Π½Ρ ΠΆΠ΄Π°Π» Π°Π΄ΡΠ΅Ρ, Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠΉΡΡ Ρ Β«blob:Β», ΠΎΠΏΠΏΠ°. Π£ΠΆΠ΅ ΡΡΠ°Π»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΏΠΎ Ρ
ΠΎΠ΄Ρ ΡΠ΅ΡΠ²ΠΈΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ, ΠΏΠΎ ΡΠ°ΠΊΡΡ, ΡΡΠΎ ΡΡΠΎ Π²ΡΡ Π΄Π΅Π»Π°Π΅Ρ js. ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, zip Π°ΡΡ
ΠΈΠ² Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠ°ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ, Π±ΡΠ°ΡΠ·Π΅Ρ, javascript. Π’.Π΅. ΠΏΡΠ΅Π»Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡ
Π‘Π΄Π΅Π»Π°Π² ΡΠΎΡΠΊ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Ρ Π½Π°ΡΠ°Π» Π΄ΡΠΌΠ°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π²Π°ΡΠΈΠ°Π½ΡΡ. ΠΠ°Π΄Π°ΡΠ° ΡΡΠ»ΠΎΠΆΠ½ΡΠ»ΠΎΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ Ρ Π½Π΅ Ρ
ΠΎΡΠ΅Π» ΠΎΡΡ
ΠΎΠ΄ΠΈΡΡ ΠΎΡ ΡΡΠ»ΠΎΠ²ΠΈΡ, ΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡΠ°Π²Π°ΡΡΡΡ ΡΠΈΡΡΡΠΌ front-end, Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ back-end. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΎΡΡΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ Π±Ρ ΠΏΠΎΠ΄ΡΡΠ½ΡΡΡ nodejs ΠΈ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π°ΡΡ
ΠΈΠ² Ρ ΠΊΠΎΠ½ΡΠΈΠ³Π°ΠΌΠΈ ΠΏΠΎ ΠΏΡΡΠΌΡΠΌ ΡΡΡΠ»ΠΊΠ°ΠΌ.
ΠΠ°ΡΠΈΠ°Π½ΡΠΎΠ², ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π±ΡΠ»ΠΎ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ. Π’ΠΎΡΠ½Π΅Π΅, Π² Π³ΠΎΠ»ΠΎΠ²Ρ ΠΏΡΠΈΡΡΠ» ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½. ΠΠ°ΠΌ Π½Π°Π΄ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΡΠ»ΠΊΡ, ΠΊΠΎΡΠΎΡΡΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ zip Π°ΡΡ
ΠΈΠ².
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ² Π² ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΠΎΠΌ zip Π°ΡΡ
ΠΈΠ²Π΅ Π²Π΅ΡΠΈΠ»ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡΠ»ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ base64 ΡΡΡΠΎΠΊΡ ΠΈΠ· ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ zip Π°ΡΡ
ΠΈΠ²Π° ΠΈ ΠΊΠΈΠ½ΡΡΡ Π΅Ρ Π² Π±ΡΡΠ΅Ρ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
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');
Π³Π΄Π΅ content, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ blob ΠΎΠ±ΡΠ΅ΠΊΡ zip Π°ΡΡ ΠΈΠ²Π°.
ΠΠΊ, Π²ΡΡ ΡΡΠΎ ΠΌΠ½Π΅ Π½Π°Π΄ΠΎ Π±ΡΠ»ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅ΡΡ ΠΎΠ΄Π½Ρ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΠ΄ΠΎΠΌ ΠΈ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° Π½Π΅Ρ Π½Π΅ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ zip Π°ΡΡ ΠΈΠ² Π² Π±ΡΠ°ΡΠ·Π΅Ρ, Π° ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΈΠ· Π½Π΅Π³ΠΎ base64 ΠΊΠΎΠ΄. ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠ°ΠΌΠ°Π½ΠΈΠ², Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» 2 ΠΌΠ΅ΡΠΎΠ΄Π°, Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ downloadZip:
$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 Π°ΡΡ
ΠΈΠ²Π° Ρ Π²ΡΠ½Π΅Ρ Π² ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ generateZip, Π½Ρ ΠΈ Ρ.ΠΊ. ΡΡΠΎ AngularJS, Π΄Π° ΠΈ ΡΠ°ΠΌ Π°Π²ΡΠΎΡ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ»Π±ΡΠΊΠΎΠ², Π½Π΅ ΡΡΠ°Π» ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ Π΅Π³ΠΎ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΠΌΠΈΡΡ. downloadZip ΠΏΠΎ ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π½Π° Π²ΡΡ
ΠΎΠ΄Π΅ Π΄Π΅Π»Π°Π» saveAs, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ downloadBase64 Π΄Π΅Π»Π°Π» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ΅. ΠΡ ΡΠΎΠ·Π΄Π°ΡΠΌ FileReader ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΏΡΠΈΡΠ΅Π΄ΡΠΈΠΉ ΠΊ Π½Π°ΠΌ Π² html5 ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠΆΠ΅
position: absolute;
z-index: -1;
opacity: 0;
ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΌΠ½Π΅ ΠΈ ΡΠΊΡΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Ρ Π³Π»Π°Π· ΠΈ ΠΏΠΎ ΡΠ°ΠΊΡΡ ΠΎΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅. ΠΡΠ°Π»Ρ, Π·Π°Π΄Π°ΡΠ° Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π°, ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° ΠΌΠΎΡ ΠΊΠ½ΠΎΠΏΠΊΡ, Π² Π±ΡΡΠ΅Ρ ΠΏΠΎΠΌΠ΅ΡΠ°Π»Π°ΡΡ ΡΡΡΠΎΠΊΠ° Π²ΠΈΠ΄Π°:
echo 'base64string' | base64 --decode > config.zip
ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΏΡΠΎΡΡΠΎ Π²ΡΡΠ°Π²Π»ΡΠ» Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΈ ΡΡΡ ΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π» zip Π°ΡΡ
ΠΈΠ² ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΊΠΎΠ½ΡΠΈΠ³Π°ΠΌΠΈ.
ΠΡ ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Ρ Π·Π°ΠΊΠΈΠ½ΡΠ» pull request Π°Π²ΡΠΎΡΡ, Ρ.ΠΊ. ΠΏΡΠΎΠ΅ΠΊΡ Π°ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΈ ΠΆΠΈΠ²ΠΎΠΉ, ΠΌΠ½Π΅ Ρ
ΠΎΡΠ΅ΡΡΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΎΡ Π°Π²ΡΠΎΡΠ° Π²ΠΈΠ΄Π΅ΡΡ ΠΈ ΡΠ²ΠΎΡ ΠΊΠ½ΠΎΠΏΠΎΠΏΡΠΊΡ ΠΈΠΌΠ΅ΡΡ ) ΠΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, Π²ΠΎΡ
ΠΡΠ΅ΠΌ Π±ΠΎΠ΄ΡΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ )
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com