Agurrak, kamaradak. Ederra nire borroka zerbitzarietan
Lagunek beraientzako garapen baserri bat ezartzeko eskatu zidaten, eta nire txantiloi zehatzak arrastatu beharrean, proiektu interesgarri bat gogoratu nuen.
Noski, iturrietan sakondu aurretik, Chrome-k sortutako zip artxiboa konfigurazioekin nondik ateratzen duen begiratu nuen, eta han "blob:"-rekin hasten zen helbide bat zegoen nire zain, aupa. Dagoeneko argi geratu da zerbitzuak ez duela ezer sortzen bidean, izan ere, js-ek egiten du dena. Izan ere, zip artxiboa bezeroak, arakatzaileak eta javascriptek berak sortzen dute. Horiek. edertasuna da proiektua
Proiektua bideratu ondoren, nire aukerak zeintzuk ziren pentsatzen hasi nintzen. Zaildu egin zen zeregina, ez nuelako desbideratu nahi proiektuak front-end hutsa izaten jarraitzeko baldintzatik, inolako back-end gabe. Noski, soluziorik errazena nodej-ak ateratzea eta lotura zuzenak erabiliz konfigurazioekin artxibo bat sortzera behartzea izango litzateke.
Egia esan, ez zegoen aukera askorik. Zehatzago esanda, bakarra etorri zitzaidan burura. Konfigurazioak konfiguratu eta zip artxibo bat lortzeko zerbitzariaren kontsolara kopia dezakegun esteka bat lortu behar dugu.
Sortutako zip artxiboko hainbat testu-fitxategik dezente pisatzen zuten, literalki kilobyte batzuk. Konponbidea agerikoa zen base64 katea sortutako zip artxibotik ateratzea eta bufferera botatzea, zerbitzarian komandoa kontsolan zegoen bitartean.
echo 'base64string' | base64 --decode > config.zip
zip fitxategi hau bera sor genezake.
Proiektuko baliabideetan zip artxibo bat sortzeko metodo bat ikusten dugu:
$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',
});
};
dena nahiko erraza da, liburutegia erabiliz
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
non edukia zip artxiboaren ondoriozko blob objektua den.
Ados, ondoan beste botoi bat gehitu behar nuen eta gainean klik egiten nuenean, ez nuen sortutako zip artxiboa nabigatzailean gordeko, base64 kodea bertatik lortuko. Pixka bat ibili ondoren, 2 metodo lortu nituen, deskarga Zip bakarraren ordez:
$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',
});
};
Konturatuko zinetenez, zip artxiboaren sorrera bera generaZip metodo pribatura eraman nuen, eta abar. Hau AngularJS da, eta egileak berak deietara atxikitzen du eta ez zuen promesen bidez ezarri. downloadZip-ek irteera gisa gorde zuen oraindik, downloadBase64-k zerbait desberdina egin zuen bitartean. html5-n iritsi zaigun FileReader objektu bat sortzen dugu eta nahikoa da dagoeneko
position: absolute;
z-index: -1;
opacity: 0;
horrek aukera eman zidan elementua bistatik ezkutatzeko eta benetan orrian uzteko. Voila, zeregina amaitu zen, nire botoian klik egin nuenean, honelako lerro bat jarri zen bufferean:
echo 'base64string' | base64 --decode > config.zip
zerbitzariko kontsolan itsatsi eta berehala zip artxibo bat jaso nuen konfigurazio guztiekin.
Eta, noski, tira eskaera bat bidali nion egileari, zeren... proiektua aktiboa eta bizia da, egilearen eguneraketak ikusi eta nire botoia eduki nahiko nuke) Interesa dutenentzat, hemen duzu
Garapen zoriontsua guztioi)
Iturria: www.habr.com