問候,同志們。 在我的戰鬥伺服器上很漂亮
朋友們讓我為他們建立一個開發農場,我沒有把我的特定模板拖給他們,而是想起了一個有趣的項目
當然,在深入研究原始程式碼之前,我查看了 Chrome 在哪裡使用配置提取生成的 zip 存檔,並且有一個以“blob:”開頭的地址在等著我,哎呀。 已經很清楚了,服務一路上並沒有生成任何東西,事實上,這一切都是由 js 完成的。 事實上,zip 檔案是由客戶端、瀏覽器和 javascript 本身產生的。 那些。 美妙之處在於該項目
分叉專案後,我開始思考我的選擇是什麼。 這項任務很複雜,因為我不想偏離該專案應該保持純前端、沒有任何後端的條件。 當然,最簡單的解決方案是拉起 NodeJS 並強制它使用直接連結產生帶有配置的存檔。
事實上,沒有太多選擇。 更準確地說,我只想到一個。 我們需要設置配置並獲取一個鏈接,我們可以將其複製到伺服器控制台以獲取 zip 存檔。
產生的 zip 檔案中的幾個文字檔案相當重,實際上有數千位元組。 顯而易見的解決方案是從產生的 zip 檔案中取得 base64 字串並將其放入緩衝區,同時在伺服器上使用控制台中的命令
echo 'base64string' | base64 --decode > config.zip
我們可以創建同樣的 zip 檔案。
在專案資源中我們看到了產生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');
其中 content 是 zip 存檔的結果 blob 物件。
好吧,我所要做的就是在它旁邊添加另一個按鈕,當我單擊它時,我不會將生成的 zip 存檔保存到瀏覽器,而是從中獲取 base64 程式碼。 經過一番擺弄後,我得到了 2 個方法,而不僅僅是一個 downloadZip:
$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 檔案本身的產生移至私有的generateZip 方法,等等。 這就是AngularJS,作者本人堅持回調,並沒有透過promise來實現。 downloadZip 仍然將 saveAs 作為輸出,而 downloadBase64 的做法略有不同。 我們建立了一個 FileReader 對象,它是在 html5 中出現的,而且已經相當好了
position: absolute;
z-index: -1;
opacity: 0;
這使我既可以從視圖中隱藏元素,又可以將其實際保留在頁面上。 瞧,任務完成了,當我單擊按鈕時,緩衝區中放置了這樣一行:
echo 'base64string' | base64 --decode > config.zip
我只是將其貼到伺服器上的控制台中,並立即收到包含所有配置的 zip 檔案。
當然,我向作者發送了拉取請求,因為... 這個專案非常活躍,我希望看到作者的更新並擁有自己的按鈕)對於有興趣的人,這裡是
祝大家發展愉快)
來源: www.habr.com