こんにちは、同志の皆さん。 私の戦闘サーバーでは美しいです
友人たちから開発ファームを立ち上げてほしいと頼まれたので、私は特定のテンプレートをドラッグする代わりに、興味深いプロジェクトを思い出しました。
もちろん、ソースを詳しく調べる前に、Chrome が生成された zip アーカイブを構成でプルする場所を確認しました。そこには、「blob:」で始まるアドレスが私を待っていました。 このサービスが途中で何も生成しないことはすでに明らかになりました。実際、それはすべて js によって行われます。 実際、zip アーカイブはクライアント、ブラウザ、JavaScript 自体によって生成されます。 それらの。 素晴らしいのは、プロジェクトであるということです
プロジェクトを分岐させた後、自分の選択肢は何なのかを考え始めました。 プロジェクトはバックエンドのない純粋なフロントエンドのままであるべきという条件から逸脱したくなかったという事実により、タスクは複雑になりました。 もちろん、最も簡単な解決策は、nodejs を取得し、直接リンクを使用して構成を含むアーカイブを強制的に生成することです。
実際には、選択肢はそれほど多くありませんでした。 正確に言うと、思いついたのはXNUMXつだけでした。 構成をセットアップし、サーバー コンソールにコピーして 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 オブジェクトです。
OK、私がしなければならなかったのは、その横に別のボタンを追加し、それをクリックしたときに、結果の zip アーカイブをブラウザに保存せず、そこから Base64 コードを取得することだけでした。 少しいじってみたところ、downloadZip は 2 つだけではなく、XNUMX つの方法が見つかりました。
$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 は少し異なる動作を行いました。 html5 で提供された FileReader オブジェクトを作成します。
position: absolute;
z-index: -1;
opacity: 0;
これにより、要素をビューから非表示にすることも、実際にページ上に残すこともできました。 ほら、タスクが完了しました。ボタンをクリックすると、次のような行がバッファに配置されました。
echo 'base64string' | base64 --decode > config.zip
これをサーバー上のコンソールに貼り付けると、すぐにすべての構成が含まれた zip アーカイブを受け取りました。
そしてもちろん、作者にプルリクエストを送信しました。なぜなら... プロジェクトはアクティブで活発です。作成者からの更新情報を確認し、独自のボタンを用意したいと思います) 興味のある方は、こちらをご覧ください。
皆さんの発展をお祈りします)
出所: habr.com