Përshëndetje, shokë. E bukur në serverët e mi luftarakë
Miqtë më kërkuan të krijoja një fermë zhvillimi për ta dhe në vend që t'i zvarritja shabllonet e mia specifike, m'u kujtua një projekt interesant
Sigurisht, përpara se të gërmoj në burimet, shikova se ku Chrome tërheq arkivin zip të gjeneruar me konfigurime, dhe atje më priste një adresë që fillon me "blob:", oops. Tashmë është bërë e qartë se shërbimi nuk gjeneron asgjë gjatë rrugës, në fakt, gjithçka bëhet nga js. Në të vërtetë, arkivi zip gjenerohet nga klienti, shfletuesi dhe vetë javascript. ato. e bukura është se projekti
Pasi përfundova projektin, fillova të mendoj se cilat ishin opsionet e mia. Detyra ishte e ndërlikuar nga fakti se nuk doja të devijoja nga kushti që projekti të mbetej një front-end i pastër, pa asnjë prapavijë. Sigurisht, zgjidhja më e thjeshtë do të ishte tërheqja e nodejs dhe detyrimi i saj për të gjeneruar një arkiv me konfigurime duke përdorur lidhje direkte.
Në fakt, nuk kishte shumë opsione. Më saktë, vetëm një më erdhi në mendje. Duhet të konfigurojmë konfigurimet dhe të marrim një lidhje që mund ta kopjojmë në tastierën e serverit për të marrë një arkiv zip.
Disa skedarë teksti në arkivin zip që rezulton peshonin mjaft, fjalë për fjalë disa kilobajt. Zgjidhja e dukshme ishte të merrej vargu base64 nga arkivi zip i gjeneruar dhe ta hidhte atë në tampon, ndërsa në server me komandën në tastierë
echo 'base64string' | base64 --decode > config.zip
ne mund të krijojmë të njëjtin skedar zip.
Në burimet e projektit ne shohim një metodë për gjenerimin e një arkivi 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',
});
};
gjithçka është mjaft e thjeshtë, duke përdorur bibliotekën
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
ku përmbajtja është objekti blob që rezulton i arkivit zip.
Ok, gjithçka që duhej të bëja ishte të shtoja një buton tjetër pranë tij dhe kur klikoja mbi të, nuk do ta ruaja arkivin zip që rezulton në shfletues, por do të merrja kodin bazë64 prej tij. Pasi u përpoqa pak, mora 2 metoda, në vend të vetëm një shkarkimi Zip:
$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',
});
};
Siç mund ta keni vënë re, unë e zhvendosa gjenerimin e vetë arkivit zip në metodën private generateZip, e kështu me radhë. Ky është AngularJS, dhe vetë autori i përmbahet thirrjeve dhe nuk e zbatoi atë përmes premtimeve. downloadZip ende bëri saveAs si një dalje, ndërsa downloadBase64 bëri diçka pak më ndryshe. Ne krijojmë një objekt FileReader që na erdhi në html5 dhe tashmë është mjaft
position: absolute;
z-index: -1;
opacity: 0;
gjë që më lejoi të fsheh elementin nga pamja dhe në fakt ta lija atë në faqe. Voila, detyra u krye, kur klikova në butonin tim, një rresht si ky u vendos në buffer:
echo 'base64string' | base64 --decode > config.zip
të cilin thjesht e ngjita në tastierën në server dhe menjëherë mora një arkiv zip me të gjitha konfigurimet.
Dhe, natyrisht, i dërgova një kërkesë për tërheqje autorit, sepse ... projekti është aktiv dhe i gjallë, do të doja të shihja përditësime nga autori dhe të kisha butonin tim) Për të interesuarit, ja ku është
Gëzuar zhvillim të gjithëve)
Burimi: www.habr.com