Salam, yoldaşlar. Döyüş serverlərimdə gözəl
Dostlar məndən onlar üçün inkişaf ferması qurmağımı istədilər və onlara xüsusi şablonlarımı sürükləmək əvəzinə maraqlı bir layihə yadıma düşdü.
Əlbətdə ki, mənbələri araşdırmadan əvvəl Chrome-un yaradılan zip arxivini konfiqurasiyalarla hara çəkdiyinə baxdım və orada “blob:” ilə başlayan bir ünvan məni gözləyirdi, oops. Artıq aydın oldu ki, xidmət yol boyu heç bir şey yaratmır, əslində hamısı js tərəfindən edilir. Həqiqətən, zip arxivi müştəri, brauzer və javascript özü tərəfindən yaradılır. Bunlar. gözəllik layihənin olmasıdır
Layihəni çəngəldən keçirdikdən sonra mənim seçimlərimin nə olduğu barədə düşünməyə başladım. Tapşırıq ona görə çətinləşdi ki, mən layihənin heç bir arxa tərəfi olmayan, sırf front-end olaraq qalması şərtindən yayınmaq istəmədim. Əlbəttə ki, ən sadə həll nodej-ləri çıxarmaq və onu birbaşa bağlantılardan istifadə edərək konfiqurasiya ilə arxiv yaratmağa məcbur etmək olardı.
Əslində çox seçim yox idi. Daha doğrusu, ağlıma yalnız biri gəldi. Konfiqurasiyaları qurmalı və zip arxivini əldə etmək üçün server konsoluna kopyalaya biləcəyimiz bir keçid əldə etməliyik.
Nəticədə zip arxivindəki bir neçə mətn faylı kifayət qədər bir qədər, sözün əsl mənasında bir neçə kilobayt ağırlığında idi. Açıq həll, konsolda əmrlə serverdə olarkən yaradılan zip arxivindən base64 sətirini almaq və buferə atmaq idi.
echo 'base64string' | base64 --decode > config.zip
biz bu eyni zip faylı yarada bilərik.
Layihə resurslarında zip arxivi yaratmaq üçün bir üsul görürük:
$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',
});
};
kitabxanadan istifadə etməklə hər şey olduqca sadədir
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
burada məzmun zip arxivinin nəticədə blob obyektidir.
Tamam, mənə başqa bir düymə əlavə etməli idim və üzərinə kliklədikdə nəticədə yaranan zip arxivini brauzerdə saxlamazdım, ondan base64 kodunu alırdım. Bir az dolaşdıqdan sonra bir downloadZip əvəzinə 2 üsul əldə etdim:
$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',
});
};
Diqqət etdiyiniz kimi, mən zip arxivinin özünün nəslini şəxsi generatorZip metoduna köçürdüm və s. Bu AngularJS-dir və müəllif özü geri çağırışlara sadiq qalır və vədlər vasitəsilə həyata keçirmir. downloadBase64 bir qədər fərqli bir şey edərkən downloadZip hələ də bir çıxış olaraq saveAs etdi. Biz html5-də bizə gələn və artıq tam olan FileReader obyekti yaradırıq
position: absolute;
z-index: -1;
opacity: 0;
bu mənə həm elementi görünüşdən gizlətməyə, həm də onu səhifədə buraxmağa imkan verdi. Voila, tapşırıq tamamlandı, düyməni tıkladığımda buferə belə bir xətt yerləşdirildi:
echo 'base64string' | base64 --decode > config.zip
Mən sadəcə serverdəki konsola yapışdırdım və dərhal bütün konfiqurasiyaları olan bir zip arxivi aldım.
Və təbii ki, mən müəllifə çəkmə sorğusu göndərdim, çünki... layihə aktiv və canlıdır, müəllifdən yenilikləri görmək istərdim və öz düyməm olsun) Maraqlananlar üçün budur
Hər kəsə uğurlar)
Mənbə: www.habr.com