Selamlar yoldaşlar. Savaş sunucularımda çok güzel
Arkadaşlarım benden kendileri için bir geliştirme çiftliği kurmamı istediler ve onlara özel şablonlarımı sürüklemek yerine ilginç bir proje aklıma geldi.
Tabii kaynaklara dalmadan önce Chrome'un oluşturulan zip arşivini yapılandırmalarla nereye çektiğine baktım ve orada "blob:" ile başlayan bir adres beni bekliyordu, ayy. Hizmetin yol boyunca hiçbir şey üretmediği zaten belli oldu, aslında hepsi js tarafından yapılıyor. Aslında zip arşivi istemci, tarayıcı ve javascript'in kendisi tarafından oluşturulur. Onlar. işin güzelliği şu ki proje
Projeyi çatalladıktan sonra seçeneklerimin neler olduğunu düşünmeye başladım. Projenin herhangi bir arka uç olmadan saf bir ön uç olarak kalması koşulundan sapmak istemediğim gerçeği nedeniyle görev karmaşıktı. Elbette en basit çözüm, nodejs'i yukarı çekmek ve doğrudan bağlantıları kullanarak yapılandırmaları içeren bir arşiv oluşturmaya zorlamak olacaktır.
Aslında çok fazla seçenek yoktu. Daha doğrusu aklıma sadece biri geldi. Zip arşivi almak için yapılandırmaları kurmamız ve sunucu konsoluna kopyalayabileceğimiz bir bağlantı almamız gerekiyor.
Ortaya çıkan zip arşivindeki birkaç metin dosyası oldukça ağırdı, kelimenin tam anlamıyla birkaç kilobayt. Açık çözüm, base64 dizesini oluşturulan zip arşivinden almak ve sunucudayken konsoldaki komutla arabelleğe atmaktı.
echo 'base64string' | base64 --decode > config.zip
aynı zip dosyasını oluşturabiliriz.
Proje kaynaklarında zip arşivi oluşturmaya yönelik bir yöntem görüyoruz:
$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',
});
};
kütüphaneyi kullanarak her şey oldukça basit
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
burada içerik, zip arşivinin sonuçta ortaya çıkan blob nesnesidir.
Tamam, tek yapmam gereken yanına bir buton eklemekti ve tıkladığımda ortaya çıkan zip arşivini tarayıcıya kaydetmeyecek, base64 kodunu ondan alacaktım. Biraz uğraştıktan sonra tek bir downloadZip yerine 2 yöntem buldum:
$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',
});
};
Fark etmiş olabileceğiniz gibi, zip arşivinin oluşturulmasını özel createdZip yöntemine vb. taşıdım. Bu AngularJS ve yazarın kendisi de geri aramalara sadık kalıyor ve bunu vaatlerle uygulamadı. downloadZip çıktı olarak saveAs'ı kullanmaya devam ederken downloadBase64 biraz farklı bir şey yaptı. Bize html5'te gelen ve zaten oldukça iyi olan bir FileReader nesnesi yaratıyoruz.
position: absolute;
z-index: -1;
opacity: 0;
bu da hem öğeyi görünümden gizlememe hem de aslında sayfada bırakmama olanak tanıdı. Voila, görev tamamlandı, butonuma tıkladığımda ara belleğe şöyle bir satır yerleştirildi:
echo 'base64string' | base64 --decode > config.zip
bunu basitçe sunucudaki konsola yapıştırdım ve hemen tüm yapılandırmaları içeren bir zip arşivi aldım.
Ve tabii ki yazara bir çekme isteği gönderdim çünkü... proje aktif ve canlı, yazarın güncellemelerini görmek ve kendi düğmemin olmasını isterim) İlgilenenler için işte burada
Herkese mutlu gelişmeler)
Kaynak: habr.com