تحياتي لكم أيها الرفاق. جميلة على خوادمي القتالية
طلب مني الأصدقاء إنشاء مزرعة تطوير لهم، وبدلاً من سحب قوالبي المحددة إليهم، تذكرت مشروعًا مثيرًا للاهتمام
بالطبع، قبل البحث في المصادر، نظرت إلى المكان الذي يسحب فيه Chrome الأرشيف المضغوط الذي تم إنشاؤه باستخدام التكوينات، وكان هناك عنوان يبدأ بـ "blob:" في انتظاري، عفوًا. لقد أصبح من الواضح بالفعل أن الخدمة لا تولد أي شيء على طول الطريق، في الواقع، يتم كل ذلك بواسطة js. في الواقع، يتم إنشاء الأرشيف المضغوط بواسطة العميل والمتصفح وجافا سكريبت نفسها. أولئك. الجميل هو أن المشروع
بعد أن تخليت عن المشروع، بدأت أفكر في الخيارات المتاحة أمامي. كانت المهمة معقدة لأنني لم أرغب في الانحراف عن شرط أن يظل المشروع واجهة أمامية خالصة، دون أي نهاية خلفية. بالطبع، سيكون الحل الأبسط هو سحب العقدة وإجبارها على إنشاء أرشيف مع التكوينات باستخدام الروابط المباشرة.
في الواقع، لم يكن هناك الكثير من الخيارات. بتعبير أدق، واحد فقط يتبادر إلى الذهن. نحتاج إلى إعداد التكوينات والحصول على رابط يمكننا نسخه إلى وحدة تحكم الخادم للحصول على أرشيف مضغوط.
كان وزن العديد من الملفات النصية في الأرشيف المضغوط الناتج قليلًا جدًا، حرفيًا بضعة كيلو بايت. كان الحل الواضح هو الحصول على سلسلة base64 من الأرشيف المضغوط الذي تم إنشاؤه وإلقائها في المخزن المؤقت أثناء وجودك على الخادم باستخدام الأمر الموجود في وحدة التحكم
echo 'base64string' | base64 --decode > config.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',
});
};
كل شيء بسيط للغاية، وذلك باستخدام المكتبة
saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
حيث يكون المحتوى هو كائن blob الناتج في الأرشيف المضغوط.
حسنًا، كل ما كان علي فعله هو إضافة زر آخر بجواره وعندما قمت بالنقر عليه، لم أكن أحفظ أرشيف ZIP الناتج في المتصفح، ولكن أحصل على رمز Base64 منه. بعد العبث قليلاً، حصلت على طريقتين، بدلاً من تنزيل 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 نفسه إلى طريقة generatorZip الخاصة، وهكذا. هذا هو AngularJS، والمؤلف نفسه يلتزم بعمليات الاسترجاعات ولم ينفذها من خلال الوعود. لا يزال downloadZip يستخدم saveAs كمخرج، بينما يفعل downloadBase64 شيئًا مختلفًا بعض الشيء. نقوم بإنشاء كائن FileReader الذي جاء إلينا بتنسيق html5 وهو موجود بالفعل
position: absolute;
z-index: -1;
opacity: 0;
مما سمح لي بإخفاء العنصر من العرض وتركه فعليًا على الصفحة. لقد اكتملت المهمة، وعندما نقرت على الزر الخاص بي، تم وضع سطر مثل هذا في المخزن المؤقت:
echo 'base64string' | base64 --decode > config.zip
والذي قمت بلصقه ببساطة في وحدة التحكم على الخادم وتلقيت على الفور أرشيفًا مضغوطًا يحتوي على جميع التكوينات.
وبطبيعة الحال، أرسلت طلب سحب إلى المؤلف، لأن... المشروع نشط وحيوي، أود أن أرى تحديثات من المؤلف وأن يكون لدي زر خاص بي) للمهتمين، ها هو
تطور سعيد للجميع)
المصدر: www.habr.com