Salamu, wandugu. Nzuri kwenye seva zangu za mapigano
Marafiki waliniuliza niwawekee shamba la maendeleo, na badala ya kuwaburuta violezo vyangu mahususi, nilikumbuka mradi wa kuvutia.
Bila shaka, kabla ya kuchimba kwenye vyanzo, niliangalia ambapo Chrome huchota kumbukumbu ya zip iliyozalishwa na usanidi, na pale anwani inayoanza na "blob:" ilikuwa inaningoja, lo! Tayari imekuwa wazi kuwa huduma haitoi chochote njiani, kwa kweli, yote yanafanywa na js. Hakika, kumbukumbu ya zip inatolewa na mteja, kivinjari, na javascript yenyewe. Wale. uzuri ni kwamba mradi
Baada ya kugawa mradi, nilianza kufikiria chaguzi zangu ni nini. Kazi hiyo ilikuwa ngumu na ukweli kwamba sikutaka kuachana na hali ya kuwa mradi huo unapaswa kubaki mbele safi, bila mwisho wowote. Kwa kweli, suluhisho rahisi zaidi itakuwa kuvuta nodejs na kuilazimisha kutoa kumbukumbu na usanidi kwa kutumia viungo vya moja kwa moja.
Kwa kweli, hakukuwa na chaguzi nyingi. Kwa usahihi, ni moja tu iliyokuja akilini. Tunahitaji kusanidi mipangilio na kupata kiungo ambacho tunaweza kunakili kwenye dashibodi ya seva ili kupata kumbukumbu ya zip.
Faili kadhaa za maandishi katika hifadhi ya zip iliyosababishwa zilikuwa na uzito kidogo, kilobaiti chache. Suluhisho dhahiri lilikuwa kupata kamba ya base64 kutoka kwa kumbukumbu ya zip iliyotengenezwa na kuitupa kwenye buffer, wakati kwenye seva na amri kwenye koni.
echo 'base64string' | base64 --decode > config.zip
tunaweza kuunda faili hii ya zip.
Katika rasilimali za mradi tunaona njia ya kutengeneza kumbukumbu ya 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',
});
};
kila kitu ni rahisi sana, kwa kutumia maktaba
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
ambapo yaliyomo ni matokeo ya kipengee cha hifadhi ya zip.
Sawa, nilichohitaji kufanya ni kuongeza kitufe kingine kando yake na nilipobofya, singehifadhi kumbukumbu ya zip iliyosababishwa kwenye kivinjari, lakini pata msimbo wa base64 kutoka kwake. Baada ya kuzunguka kidogo, nilipata njia 2, badala ya kupakuaZip moja tu:
$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',
});
};
Kama unaweza kuwa umegundua, nilihamisha kizazi cha kumbukumbu ya zip kwa njia ya kibinafsi ya generateZip, na kadhalika. Hii ni AngularJS, na mwandishi mwenyewe anashikilia kwa kurudi nyuma na hakuitekeleza kupitia ahadi. downloadZip bado ilifanya saveAs kama pato, wakati downloadBase64 ilifanya kitu tofauti kidogo. Tunaunda kitu cha FileReader ambacho kilitujia katika html5 na tayari iko kabisa
position: absolute;
z-index: -1;
opacity: 0;
ambayo iliniruhusu kuficha kitu hicho kisionekane na kwa kweli kukiacha kwenye ukurasa. Voila, kazi hiyo ilikamilishwa, nilipobofya kitufe changu, mstari kama huu uliwekwa kwenye buffer:
echo 'base64string' | base64 --decode > config.zip
ambayo nilibandika tu kwenye koni kwenye seva na mara moja nikapokea kumbukumbu ya zip na usanidi wote.
Na, kwa kweli, nilituma ombi la kuvuta kwa mwandishi, kwa sababu ... mradi ni hai na hai, ningependa kuona sasisho kutoka kwa mwandishi na kuwa na kitufe changu) Kwa wale wanaopenda, hii hapa
Maendeleo ya furaha kila mtu)
Chanzo: mapenzi.com