เบเบปเบกเปเบเบตเบ, เบชเบฐเบซเบฒเบ. เบชเบงเบเบเบฒเบกเปเบเปเบเบตเบเปเบงเบตเบเบฒเบเบเปเปเบชเบนเปเบเบญเบเบเปเบญเบ
เปเบนเปเปเบเปเบเปเปเบซเปเบเปเบญเบเบเบฑเปเบเบเบฒเบกเบเบฑเบเบเบฐเบเบฒเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒ, เปเบฅเบฐเปเบเบเบเบตเปเบเบฐเบฅเบฒเบเปเบกเปเปเบเบเบชเบฐเปเบเบฒเบฐเบเบญเบเบเปเบญเบ, เบเปเบญเบเบเบทเปเปเบเปเปเบเบเบเบฒเบเบเบตเปเปเปเบฒเบชเบปเบเปเบ.
เปเบเปเบเบญเบ, เบเปเบญเบเบเบตเปเบเบฐเบเบธเบเบเบปเปเบเปเบซเบผเปเบเบเปเปเบกเบนเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบเบดเปเบเบเปเบญเบเบเบตเป Chrome เบเบถเบเปเบเปเบก zip เบเบตเปเบชเปเบฒเบเบเบถเปเบเบเปเบงเบเบเบฒเบเบเบฑเปเบเบเปเบฒ, เปเบฅเบฐเบกเบตเบเบตเปเบขเบนเปเปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบ "blob:" เบฅเปเบเปเบฒเบเปเบญเบ, oops. เบกเบฑเบเปเบเปเบเบฒเบเปเบเบฑเบเบเบตเปเบเบฑเบเปเบเบเปเบฅเปเบงเบงเปเบฒเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเปเปเปเบเปเบชเปเบฒเบเบชเบดเปเบเปเบเบเบฒเบกเบเบฒเบ, เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, เบกเบฑเบเบเบฑเบเบซเบกเบปเบเปเบกเปเบเปเบฎเบฑเบเปเบเบ js. เปเบเปเบเบดเบเปเบฅเปเบง, zip archive เปเบกเปเบเบชเปเบฒเบเบเบถเปเบเปเบเบเบฅเบนเบเบเปเบฒ, เบเบปเบงเบเปเบญเบเปเบงเบฑเบ, เปเบฅเบฐ javascript เบเบปเบงเบเบญเบเบกเบฑเบเปเบญเบ. เปเบซเบผเบปเปเบฒเบเบฑเปเบ. เบเบงเบฒเบกเบเบฒเบกเปเบกเปเบเบงเปเบฒเปเบเบเบเบฒเบ
เบซเบผเบฑเบเบเบฒเบ forking เปเบเบเบเบฒเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบฅเบตเปเบกเบเบปเปเบเบเบดเบเบเปเบฝเบงเบเบฑเบเบชเบดเปเบเบเบตเปเบเบฒเบเปเบฅเบทเบญเบเบเบญเบเบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบกเปเบ. เบงเบฝเบเบเบฒเบเปเบกเปเบเบชเบฑเบเบชเบปเบเปเบเบเบเบงเบฒเบกเบเบดเบเบเบตเปเบงเปเบฒเบเปเบญเบเบเปเปเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐ deviate เบเบฒเบเปเบเบทเปเบญเบเปเบเบเบตเปเปเบเบเบเบฒเบเบเบงเบเบเบฐเบเบฑเบเบเบปเบเปเบเบฑเบเบเบฒเบเบซเบเปเบฒเบเปเบฅเบดเบชเบธเบ, เปเบเบเบเปเปเบกเบตเบเบฒเบ back-end เปเบ. เปเบเปเบเบญเบ, เบเบฒเบเปเบเปเปเบเบเบตเปเบเปเบฒเบเบเบฒเบเบเบตเปเบชเบธเบเปเบกเปเบเบเบฒเบเบเบถเบ nodejs เปเบฅเบฐเบเบฑเบเบเบฑเบเปเบซเปเบกเบฑเบเบชเปเบฒเบเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบเบเบตเปเบกเบตเบเบฒเบเบเบฑเปเบเบเปเบฒเปเบเบเปเบเปเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเปเบเบเบเบปเบ.
เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, เบเปเปเบกเบตเบเบฒเบเปเบฅเบทเบญเบเบซเบผเบฒเบ. เบซเบผเบฒเบเบเบตเปเบเบฑเบเปเบเบ, เบกเบตเบเบฝเบเปเบเปเบซเบเบถเปเบเบกเบฒเปเบเปเบ. เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเบฑเปเบเบเปเบฒ configs เปเบฅเบฐเปเบเปเบฎเบฑเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบตเปเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบฑเบเบฅเบญเบเปเบเบเบตเป server console เปเบเบทเปเบญเปเบซเปเปเบเปเบฎเบฑเบ zip archive.
เปเบเบฅเปเบเปเปเบเบงเบฒเบกเบซเบผเบฒเบเบญเบฑเบเปเบเปเบเปเบก zip เบเบตเปเปเบเบฑเบเบเบปเบเบญเบญเบเบกเบฒเบกเบตเบเปเปเบฒเปเบฑเบเปเปเบญเบเปเบถเปเบ, เปเบเบปเปเบฒเบเบฑเบเบชเบญเบเบชเบฒเบกเบเบดเปเบฅเปเบ. เบเบฒเบเปเบเปเปเบเบเบตเปเบเบฑเบเปเบเบเปเบกเปเบเปเบเปเบฎเบฑเบเบชเบฒเบ base64 เบเบฒเบเปเบเปเบก zip เบเบตเปเบชเปเบฒเบเบเบถเปเบเปเบฅเบฐเบเบดเปเบกเบกเบฑเบเปเบเบปเปเบฒเปเบเปเบ buffer, เปเบเบเบฐเบเบฐเบเบตเปเบขเบนเปเปเบเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบเบเบตเปเบกเบตเบเปเบฒเบชเบฑเปเบเปเบ console.
echo 'base64string' | base64 --decode > config.zip
เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบชเปเบฒเบเปเบเบฅเป zip เบเบฝเบงเบเบฑเบเบเบตเป.
เปเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบเบญเบเปเบเบเบเบฒเบเบเบงเบเปเบฎเบปเบฒเปเบซเบฑเบเบงเบดเบเบตเบเบฒเบเบชเปเบฒเบ zip archive:
$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');
เบเปเบญเบเบเบตเปเปเบเบทเปเบญเบซเบฒเปเบกเปเบเบงเบฑเบเบเบธ blob เบเบปเบเปเบเปเบฎเบฑเบเบเบญเบเบเบฒเบเปเบเบฑเบ zip.
เบเบปเบเบฅเบปเบ, เบเบฑเบเบซเบกเบปเบเบเบตเปเบเปเบญเบเบเปเบญเบเปเบฎเบฑเบเบเบทเบเบฒเบเปเบเบตเปเบกเบเบธเปเบกเบญเบทเปเบเบเบตเปเบขเบนเปเบเปเบฒเบเบกเบฑเบเปเบฅเบฐเปเบกเบทเปเบญเบเปเบญเบเบเบฅเบดเบเปเบชเปเบกเบฑเบ, เบเปเบญเบเบเบฐเบเปเปเบเบฑเบเบเบถเบ zip archive เบเบปเบเปเบเปเบฎเบฑเบเปเบเบซเบฒเบเบปเบงเบเปเบญเบเปเบงเบฑเบ, เปเบเปเปเบเปเบฎเบฑเบเบฅเบฐเบซเบฑเบ 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 archive เบเบปเบงเบกเบฑเบเปเบญเบเปเบเบซเบฒเบงเบดเบเบตเบเบฒเบ generateZip เบชเปเบงเบเบเบปเบง, เปเบฅเบฐเบญเบทเปเบเป. เบเบตเปเปเบกเปเบ AngularJS, เปเบฅเบฐเบเบนเปเบเบฝเบเปเบญเบเบเบถเบเบซเบกเบฑเปเบเบเบฑเบเบเบฒเบเปเบญเบตเปเบเบเบทเบเปเบฅเบฐเบเปเปเปเบเปเบเบฐเบเบดเบเบฑเบเบกเบฑเบเบเปเบฒเบเบเปเบฒเบชเบฑเบเบเบฒ. downloadZip เบเบฑเบเปเบฎเบฑเบ saveAs เปเบเบฑเบเบเบปเบเบเบฐเบฅเบดเบ, เปเบเบเบฐเบเบฐเบเบตเป downloadBase64 เปเบฎเบฑเบเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเปเบฅเบฑเบเบเปเบญเบ. เบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบเบงเบฑเบเบเบธ FileReader เบเบตเปเปเบเบปเปเบฒเบกเบฒเบซเบฒเบเบงเบเปเบฎเบปเบฒเปเบ html5 เปเบฅเบฐเบเปเบญเบเบเปเบฒเบเปเบฅเปเบง
position: absolute;
z-index: -1;
opacity: 0;
เปเบเบดเปเบเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเปเบญเบเบเบฑเบเบชเบญเบเปเบเบทเปเบญเบเบญเบปเบเบเบฐเบเบญเบเบเบฒเบเบเบฒเบเปเบเบดเปเบเปเบฅเบฐเบเบปเบงเบเบดเบเปเบฅเปเบงเบเปเบญเบเปเบซเปเบกเบฑเบเบขเบนเปเปเบเบซเบเปเบฒ. Voila, เบงเบฝเบเบเบฒเบเปเบเปเบเบทเบเบชเปเบฒเปเบฅเบฑเบ, เปเบเปเบงเบฅเบฒเบเบตเปเบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฅเบดเบเปเบชเปเบเบธเปเบกเบเบญเบเบเปเบฒเบเบฐเปเบเบปเปเบฒ, เปเบชเบฑเปเบเปเบเบฑเปเบเบเบตเปเปเบเปเบเบทเบเบเบฑเบเปเบชเปเปเบ buffer:
echo 'base64string' | base64 --decode > config.zip
เบเบตเปเบเปเบญเบเบเบฝเบเปเบเปเบงเบฒเบเบฅเบปเบเปเบ console เปเบเปเบเบตเบเปเบงเบตเปเบฅเบฐเบเบฑเบเบเบตเปเบเปเบฎเบฑเบเบเบฒเบเปเบเบฑเบ zip เบเบฑเบ config เบเบฑเบเบซเบกเบปเบ.
เปเบฅเบฐ, เปเบเปเบเบญเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบชเบปเปเบเบเปเบฒเบฎเปเบญเบเบเปเบเบถเบเบเบฑเบเบเบนเปเบเบฝเบ, เปเบเบฒเบฐเบงเปเบฒ ... เปเบเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบงเปเบกเปเบเบกเบตเบเบฒเบเปเบเบทเปเบญเบเปเบซเบงเปเบฅเบฐเบกเบตเบเบตเบงเบดเบเบเบตเบงเบฒ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเบขเบฒเบเปเบซเบฑเบเบเบฒเบเบเบฑเบเบเบธเบเบเบฒเบเบเบนเปเบเบฝเบเปเบฅเบฐเบกเบตเบเบธเปเบกเบเบญเบเบเปเบญเบเปเบญเบ) เบชเปเบฒเบฅเบฑเบเบเบนเปเบเบตเปเบชเบปเบเปเบ, เบเบตเปเปเบกเปเบ
เบชเบธเบเบชเบฑเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเบธเบเบเบปเบ)
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com