Сайн байцгаана уу, нөхдүүд. Миний байлдааны серверүүд дээр үзэсгэлэнтэй
Найзууд надаас өөрсдөдөө зориулж хөгжлийн ферм байгуулахыг хүссэн бөгөөд би тэдэнд өөрийн загваруудаа чирэхийн оронд нэгэн сонирхолтой төслийг санав.
Мэдээжийн хэрэг, эх сурвалжийг судлахын өмнө би Chrome үүсгэсэн зип архивыг тохиргоотой хаана татаж байгааг харвал тэнд "blob:" гэж эхэлсэн хаяг намайг хүлээж байсан. Энэ үйлчилгээ нь замдаа юу ч үүсгэдэггүй нь аль хэдийн тодорхой болсон, үнэндээ бүгдийг js хийдэг. Үнэн хэрэгтээ зип архивыг үйлчлүүлэгч, хөтөч болон javascript өөрөө үүсгэнэ. Тэдгээр. гоо сайхан нь төсөл юм
Төслийг гацаасны дараа би ямар сонголт хийх талаар бодож эхэлсэн. Төсөл нь ямар ч арын хэсэггүй, цэвэр урд тал хэвээр байх ёстой гэсэн нөхцлөөс хазайхыг хүсээгүй учраас даалгавар нь төвөгтэй байсан. Мэдээжийн хэрэг, хамгийн энгийн шийдэл бол nodej-уудыг татаж аваад шууд холбоос ашиглан тохиргоотой архив үүсгэх явдал юм.
Үнэндээ тийм ч олон сонголт байгаагүй. Бүр тодруулбал нэг л санаанд орж ирсэн. Бид тохиргоог хийж, зип архив авахын тулд серверийн консол руу хуулж болох холбоосыг авах хэрэгтэй.
Үүссэн зип архивын хэд хэдэн текст файлууд нь нэлээд жинтэй буюу хэдхэн килобайт жинтэй байв. Хамгийн ойлгомжтой шийдэл бол консол дээрх командын тусламжтайгаар сервер дээр байх үед үүсгэсэн зип архиваас base64 мөрийг авч буфер руу хаях явдал байв.
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');
Энд контент нь зип архивын үүссэн blob объект юм.
За, миний хийх ёстой зүйл бол хажууд нь өөр товчлуур нэмж, дээр нь дарахад үүссэн зип архивыг хөтөч рүү хадгалахгүй, харин тэндээс base64 кодыг авах болно. Би жаахан эргэлзсэний эцэст ганц татаж авах Zip-ын оронд 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 архивын үеийг өөрөө private generateZip арга руу шилжүүлсэн гэх мэт. Энэ бол AngularJS бөгөөд зохиогч өөрөө дуудлагыг дагаж мөрдөж, амлалтаар дамжуулан хэрэгжүүлээгүй. downloadZip нь saveA-г гаралт болгон хийсэн хэвээр байхад downloadBase64 нь арай өөр зүйл хийсэн. Бид html5-д ирсэн FileReader объектыг үүсгэсэн бөгөөд аль хэдийн бүрэн болсон
position: absolute;
z-index: -1;
opacity: 0;
Энэ нь элементийг харагдахаас нууж, хуудсан дээр үлдээх боломжийг надад олгосон. Voila, даалгавар дууслаа, би товчлуур дээр дарахад буферт ийм мөр тавигдсан:
echo 'base64string' | base64 --decode > config.zip
Үүнийг би зүгээр л сервер дээрх консол руу буулгаж, бүх тохиргоотой zip архивыг шууд хүлээн авлаа.
Мэдээжийн хэрэг, би зохиогч руу татах хүсэлт илгээсэн, учир нь ... Төсөл идэвхтэй бөгөөд идэвхтэй байна, би зохиогчоос шинэчлэлтүүдийг харахыг хүсч, өөрийн гэсэн товчлууртай байхыг хүсч байна) Сонирхсон хүмүүст зориулж энд байна
Бүгдэд нь хөгжил цэцэглэлтийг хүсье)
Эх сурвалж: www.habr.com