Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π° nginx, история Π½Π° Π΅Π΄Π½Π° заявка Π·Π° изтСглянС

ΠŸΠΎΠ·Π΄Ρ€Π°Π²ΠΈ, Π΄Ρ€ΡƒΠ³Π°Ρ€ΠΈ. ΠšΡ€Π°ΡΠΈΠ²ΠΎ Π½Π° ΠΌΠΎΠΈΡ‚Π΅ Π±ΠΎΠΉΠ½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ Nginx Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΎΡ‚ 2006 Π³. ΠΈ ΠΏΡ€Π΅Π· Π³ΠΎΠ΄ΠΈΠ½ΠΈΡ‚Π΅ Π½Π° Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ администриранС съм Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π» ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ Ρ‚Π΅ΠΌΠΏΠ»Π΅ΠΉΡ‚ΠΈ. Много Ρ…Π²Π°Π»Π΅Ρ… nginx ΠΈ някак си сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ Π΄ΠΎΡ€ΠΈ пуснах nginx Ρ…ΡŠΠ± ΠΈ Π½Π° Ρ…ΡŠΠ±Π°, ΠΏΠΎΠΊΠ°ΠΆΠΈ сС ΠΌ/
ΠŸΡ€ΠΈΡΡ‚Π΅Π»ΠΈ ΠΌΠ΅ ΠΏΠΎΠΌΠΎΠ»ΠΈΡ…Π° Π΄Π° създам Ρ„Π΅Ρ€ΠΌΠ° Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π·Π° тях ΠΈ вмСсто Π΄Π° ΠΈΠΌ Π²Π»Π°Ρ‡Π° ΠΌΠΎΠΈΡ‚Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ шаблони, си спомних интСрСсСн ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ nginxconfig.io, ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π·ΠΏΡ€ΡŠΡΠΊΠ²Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅ ΠΏΠΎ Ρ€Π°Ρ„Ρ‚ΠΎΠ²Π΅Ρ‚Π΅ ΠΈ подготвя всичко Π·Π° lets encrypt ΠΈ Ρ‚.Π½. ΠŸΠΎΠΌΠΈΡΠ»ΠΈΡ… си Π·Π°Ρ‰ΠΎ Π½Π΅? Бях вбСсСн ΠΎΠ±Π°Ρ‡Π΅ ΠΎΡ‚ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ nginxconfig ΠΌΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π° Π΄Π° изтСгля zip Π°Ρ€Ρ…ΠΈΠ²Π° Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, Π±Π΅Π· Π΄Π° ΠΌΠΈ позволява Π΄Π° Π³ΠΎ ΠΊΠ°Ρ‡Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° wget/fetch/curl. Π©ΠΎ Π·Π° глупости, Π·Π°Ρ‰ΠΎ ΠΌΠΈ трябва Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, трябва ΠΌΠΈ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΎΡ‚ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°. Ядосан, ΠΎΡ‚ΠΈΠ΄ΠΎΡ… Π² github, Π·Π° Π΄Π° видя Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Ρ€Π°Π·ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΡƒ ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° Π΄ΠΎ заявка Π·Π° изтСглянС. Π—Π° ΠΊΠΎΠ΅Ρ‚ΠΎ нямашС Π΄Π° пиша, Π°ΠΊΠΎ Π½Π΅ бСшС интСрСсно πŸ˜‰

Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π° nginx, история Π½Π° Π΅Π΄Π½Π° заявка Π·Π° изтСглянС

Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° сС разровя Π² ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈΡ‚Π΅, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Ρ… къдС Chrome изтСгля гСнСрирания zip Π°Ρ€Ρ…ΠΈΠ² с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ Ρ‚Π°ΠΌ ΠΌΠ΅ Ρ‡Π°ΠΊΠ°ΡˆΠ΅ адрСс, Π·Π°ΠΏΠΎΡ‡Π²Π°Ρ‰ с β€žblob:β€œ, ΠΎΠΏΠ°. Π’Π΅Ρ‡Π΅ стана ясно, Ρ‡Π΅ услугата Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Π½ΠΈΡ‰ΠΎ ΠΏΠΎ ΠΏΡŠΡ‚Ρ, Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ всичко сС ΠΏΡ€Π°Π²ΠΈ ΠΎΡ‚ js. Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ zip Π°Ρ€Ρ…ΠΈΠ²ΡŠΡ‚ сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΎΡ‚ самия ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ ΠΈ javascript. Π’Π΅Π·ΠΈ. красотата Π΅, Ρ‡Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ nginxconfig.io ΠΌΠΎΠΆΠ΅ просто Π΄Π° сС Π·Π°ΠΏΠ°Π·ΠΈ ΠΊΠ°Ρ‚ΠΎ html страница, Π΄Π° сС ΠΊΠ°Ρ‡ΠΈ Π½Π° някои narod.ru ΠΈ Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ) Π’ΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π±Π°Π²Π½ΠΎ ΠΈ интСрСсно Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π½ΠΎ Π΅ уТасно Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π·Π° настройка Π½Π° ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π° Ρ‚ΠΎΠ²Π°, Π·Π° ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ създадСн Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π˜Π·Ρ‚Π΅Π³Π»Π΅Ρ‚Π΅ гСнСрирания Π°Ρ€Ρ…ΠΈΠ² с Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ ΠΈ слСд Ρ‚ΠΎΠ²Π° Π³ΠΎ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Π΅Ρ‚Π΅ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° nc... ΠΏΡ€Π΅Π· 2019 Π³.? ΠŸΠΎΡΡ‚Π°Π²ΠΈΡ… си Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π΄Π° намСря Π½Π°Ρ‡ΠΈΠ½ Π΄Π° изтСгля ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°Ρ‚Π° конфигурация Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°.
Π‘Π»Π΅Π΄ разклоняванСто Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ… Π΄Π° мисля ΠΊΠ°ΠΊΠ²ΠΈ са Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ ΠΌΠΈ. Π—Π°Π΄Π°Ρ‡Π°Ρ‚Π° сС ΡƒΡΠ»ΠΎΠΆΠ½ΡΠ²Π°ΡˆΠ΅ ΠΎΡ‚ Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ Π½Π΅ исках Π΄Π° сС отклонявам ΠΎΡ‚ условиСто ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ Π΄Π° си останС чист front-end, Π±Π΅Π· back-end. Π Π°Π·Π±ΠΈΡ€Π° сС, Π½Π°ΠΉ-простото Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΡ‚Π΅ nodejs ΠΈ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Π°Ρ€Ρ…ΠΈΠ² с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈ.
Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ нямашС ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ. По-Ρ‚ΠΎΡ‡Π½ΠΎ само Π΅Π΄Π½ΠΎ ΠΌΠΈ Π΄ΠΎΠΉΠ΄Π΅ Π½Π°ΡƒΠΌ. Врябва Π΄Π° настроим ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅ ΠΈ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π²Ρ€ΡŠΠ·ΠΊΠ°, която ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ zip Π°Ρ€Ρ…ΠΈΠ².
Няколко тСкстови Ρ„Π°ΠΉΠ»Π° Π² получСния zip Π°Ρ€Ρ…ΠΈΠ² Ρ‚Π΅ΠΆΠ°Ρ…Π° доста, Π±ΡƒΠΊΠ²Π°Π»Π½ΠΎ няколко ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚Π°. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ бСшС Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ base64 Π½ΠΈΠ·Π° ΠΎΡ‚ гСнСрирания zip Π°Ρ€Ρ…ΠΈΠ² ΠΈ Π΄Π° Π³ΠΎ Ρ…Π²ΡŠΡ€Π»ΠΈΡ‚Π΅ Π² Π±ΡƒΡ„Π΅Ρ€Π°, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ стС Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°

echo 'base64string' | base64 --decode > config.zip

Π±ΠΈΡ…ΠΌΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π΄Π° създадСм ΡΡŠΡ‰ΠΈΡ Ρ‚ΠΎΠ·ΠΈ zip Ρ„Π°ΠΉΠ».

nginxconfig.io Π΅ написан Π½Π° AngularJS, Π΄ΠΎΡ€ΠΈ Π½Π΅ ΠΌΠΎΠ³Π° Π΄Π° си прСдставя ΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΈΠ»ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΊΠΎΠ΄ Π±ΠΈΡ…Π° Π±ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ, Π°ΠΊΠΎ Π°Π²Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π΅ бСшС ΠΈΠ·Π±Ρ€Π°Π» Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Π° js Ρ€Π°ΠΌΠΊΠ°. Но ΠΌΠΎΠ³Π° напълно Π΄Π° си прСдставя ΠΊΠΎΠ»ΠΊΠΎ ΠΏΠΎ-просто ΠΈ ΠΏΠΎ-красиво всичко Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ във VueJS, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ съвсСм Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° Ρ‚Π΅ΠΌΠ°.
Π’ рСсурситС Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° 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',
	});
};

всичко Π΅ съвсСм просто, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° jszip Бъздава сС zip Ρ„Π°ΠΉΠ», ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ сС поставят ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ създадС zip Π°Ρ€Ρ…ΠΈΠ²Π°, js Π³ΠΎ ΠΏΠΎΠ΄Π°Π²Π° към Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° FileSaver.js:

saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ получСният Π±Π»ΠΎΠ± ΠΎΠ±Π΅ΠΊΡ‚ Π½Π° zip Π°Ρ€Ρ…ΠΈΠ²Π°.

Π”ΠΎΠ±Ρ€Π΅, всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° направя, бСшС Π΄Π° добавя Π΄Ρ€ΡƒΠ³ Π±ΡƒΡ‚ΠΎΠ½ Π΄ΠΎ Π½Π΅Π³ΠΎ ΠΈ ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‰Ρ€Π°ΠΊΠ½Π° Π²ΡŠΡ€Ρ…Ρƒ Π½Π΅Π³ΠΎ, нямашС Π΄Π° запазя получСния zip Π°Ρ€Ρ…ΠΈΠ² Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, Π½ΠΎ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π° ΠΊΠΎΠ΄Π° base64 ΠΎΡ‚ Π½Π΅Π³ΠΎ. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ сС ΠΏΠΎΡ€Π°Π·Ρ€ΠΎΠ²ΠΈΡ… ΠΌΠ°Π»ΠΊΠΎ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ… 2 ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, вмСсто само Π΅Π΄Π½ΠΎ изтСглянС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',
	});
};

ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π±ΠΈ стС забСлязали, прСмСстих Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° самия zip Π°Ρ€Ρ…ΠΈΠ² към ΠΌΠ΅Ρ‚ΠΎΠ΄Π° private generateZip ΠΈ Ρ‚.Π½. Π’ΠΎΠ²Π° Π΅ AngularJS ΠΈ самият Π°Π²Ρ‚ΠΎΡ€ сС ΠΏΡ€ΠΈΠ΄ΡŠΡ€ΠΆΠ° към ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΈΡ‚Π΅ извиквания ΠΈ Π½Π΅ Π³ΠΎ Π΅ Π²Π½Π΅Π΄Ρ€ΠΈΠ» Ρ‡Ρ€Π΅Π· обСщания. downloadZip всС ΠΎΡ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈ saveAs ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Ρ…ΠΎΠ΄, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ downloadBase64 Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π΅Ρ‰ΠΎ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ. БъздавамС ΠΎΠ±Π΅ΠΊΡ‚ FileReader, ΠΊΠΎΠΉΡ‚ΠΎ Π΄ΠΎΠΉΠ΄Π΅ ΠΏΡ€ΠΈ нас Π² html5 ΠΈ Π²Π΅Ρ‡Π΅ Π΅ доста Π½Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅. ΠšΠΎΠ΅Ρ‚ΠΎ Π² Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ base64 Π½ΠΈΠ· ΠΎΡ‚ blob, ΠΈΠ»ΠΈ ΠΏΠΎ-скоро ΠΏΡ€Π°Π²ΠΈ DataURL Π½ΠΈΠ·, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π²Π°ΠΆΠ½ΠΎ Π·Π° нас, Ρ‚.ΠΊ. DataURL ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚ΠΎΠ²Π°, ΠΎΡ‚ ΠΊΠΎΠ΅Ρ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ. Π‘ΠΈΠ½Π³ΠΎ, ΠΌΠ°Π»ΠΊΠΎ ΠΌΠ΅ Ρ‡Π°ΠΊΠ°ΡˆΠ΅, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΎΠΏΠΈΡ‚Π°Ρ… Π΄Π° слоТа всичко Ρ‚ΠΎΠ²Π° Π² Π±ΡƒΡ„Π΅Ρ€Π°. ΠΠ²Ρ‚ΠΎΡ€ΡŠΡ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ»ΠΈΠΏΠ±ΠΎΡ€Π΄js, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΈ позволява Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ с ΠΊΠ»ΠΈΠΏΠ±ΠΎΡ€Π΄Π° Π±Π΅Π· Ρ„Π»Π°Ρˆ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, въз основа Π½Π° избрания тСкст. ΠŸΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ Ρ€Π΅ΡˆΠΈΡ… Π΄Π° поставя своя base64 Π² Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ с display:none;, Π½ΠΎ Π² Ρ‚ΠΎΠ·ΠΈ случай Π½Π΅ ΠΌΠΎΠΆΠ°Ρ… Π΄Π° Π³ΠΎ поставя Π² ΠΊΠ»ΠΈΠΏΠ±ΠΎΡ€Π΄Π°, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π½Π΅ Π½Π°ΡΡ‚ΡŠΠΏΠ²Π° раздяла. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, вмСсто display:none; Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…

position: absolute;
z-index: -1;
opacity: 0;

ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π° скрия Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΎΡ‚ ΠΈΠ·Π³Π»Π΅Π΄ ΠΈ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΄Π° Π³ΠΎ оставя Π½Π° страницата. Π’ΠΎΠ°Π»Π°, Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° бСшС изпълнСна, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‰Ρ€Π°ΠΊΠ½Π°Ρ… Π²ΡŠΡ€Ρ…Ρƒ моя Π±ΡƒΡ‚ΠΎΠ½, Π² Π±ΡƒΡ„Π΅Ρ€Π° бСшС поставСн Ρ€Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ·ΠΈ:

echo 'base64string' | base64 --decode > config.zip

ΠΊΠΎΠΉΡ‚ΠΎ просто поставих Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ… zip Π°Ρ€Ρ…ΠΈΠ² с всички ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.
И, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΡ… заявка Π·Π° изтСглянС Π½Π° Π°Π²Ρ‚ΠΎΡ€Π°, Π·Π°Ρ‰ΠΎΡ‚ΠΎ... ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ Π΅ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΈ ΠΎΠΆΠΈΠ²Π΅Π½, Π±ΠΈΡ… искал Π΄Π° Π²ΠΈΠΆΠ΄Π°ΠΌ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π° ΠΈ Π΄Π° ΠΈΠΌΠ°ΠΌ собствСн Π±ΡƒΡ‚ΠΎΠ½) Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС интСрСсуват, Π΅Ρ‚ΠΎ Π³ΠΎ моята Π²ΠΈΠ»ΠΈΡ†Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ сСбС си pull request, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Ρ…/Π΄ΠΎΠ±Π°Π²ΠΈΡ….
ЧСстито Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ Π½Π° всички)

Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π° nginx, история Π½Π° Π΅Π΄Π½Π° заявка Π·Π° изтСглянС

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€