Tervehdys, toverit. Kaunis taistelupalvelimillani
Ystävät pyysivät minua perustamaan heille kehitystilan, ja sen sijaan, että olisin vetänyt heille omia mallejani, muistin mielenkiintoisen projektin
Tietenkin ennen lähteisiin kaivaamista katsoin, mistä Chrome vetää luodun zip-arkiston asetusten kanssa, ja siellä minua odotti "blob:"-alkuinen osoite, oho. On jo käynyt selväksi, että palvelu ei tuota matkan varrella mitään, itse asiassa sen kaiken tekee js. Itse asiassa asiakas, selain ja javascript luovat zip-arkiston. Nuo. kauneus on siinä, että projekti
Projektin haaroittamisen jälkeen aloin miettiä vaihtoehtojani. Tehtävää vaikeutti se, että en halunnut poiketa ehdosta, jonka mukaan projektin tulisi pysyä puhtaana front-endinä, ilman taustaa. Tietenkin yksinkertaisin ratkaisu olisi vetää ylös nodejs ja pakottaa se luomaan arkisto konfiguraatioineen suorien linkkien avulla.
Itse asiassa vaihtoehtoja ei ollut paljon. Tarkemmin sanottuna vain yksi tuli mieleen. Meidän on määritettävä asetukset ja hankittava linkki, jonka voimme kopioida palvelinkonsoliin saadaksemme zip-arkiston.
Useat tekstitiedostot tuloksena syntyneessä zip-arkistossa painoivat melko vähän, kirjaimellisesti muutaman kilotavun. Ilmeinen ratkaisu oli saada base64-merkkijono luodusta zip-arkistosta ja heittää se puskuriin ollessaan palvelimella konsolin komennolla
echo 'base64string' | base64 --decode > config.zip
voisimme luoda saman zip-tiedoston.
Projektiresursseissa näemme menetelmän zip-arkiston luomiseksi:
$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',
});
};
kaikki on melko yksinkertaista kirjaston avulla
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
jossa sisältö on zip-arkiston tuloksena oleva blob-objekti.
Ok, minun piti vain lisätä toinen painike sen viereen ja sitä napsauttaessa en tallentanut tuloksena olevaa zip-arkistoa selaimeen, vaan sain siitä base64-koodin. Hieman puuhailun jälkeen sain 2 tapaa yhden downloadZipin sijaan:
$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',
});
};
Kuten olet ehkä huomannut, siirsin itse zip-arkiston luomisen yksityiseen generateZip-menetelmään ja niin edelleen. Tämä on AngularJS, ja kirjoittaja itse pitää kiinni takaisinkutsuista eikä toteuttanut sitä lupausten kautta. downloadZip teki silti saveAs:n ulostulona, kun taas downloadBase64 teki jotain hieman erilaista. Luomme FileReader-objektin, joka tuli meille html5:ssä ja on jo melkoinen
position: absolute;
z-index: -1;
opacity: 0;
jolloin pystyin piilottamaan elementin näkyvistä ja jättämään sen sivulle. Voila, tehtävä oli suoritettu, kun klikkasin painikettani, puskuriin laitettiin tällainen rivi:
echo 'base64string' | base64 --decode > config.zip
jonka yksinkertaisesti liitin palvelimen konsoliin ja sain heti zip-arkiston, jossa oli kaikki asetukset.
Ja tietysti lähetin vetopyynnön kirjoittajalle, koska... projekti on aktiivinen ja vilkas, haluaisin nähdä päivityksiä kirjoittajalta ja omaa nappia) Kiinnostuneille tässä
Hyvää kehitystä kaikille)
Lähde: will.com