ユーザーが好きなアルバム全体を自分のコンピューターにダウンロードするまで、すべてがうまくいきました。
猫の下で、これをどのように実装したかを説明します。
頭に浮かぶ最初の決定は、各アルバムのアーカイブを作成してユーザーに提供することです。
このオプションを放棄した主な理由は、たくさんの音楽があり、各アルバムのアーカイブを作成することは、ディスク容量に2を掛ける必要があることを意味します。
リクエストに応じて、その場でアルバムのアーカイブを作成することが理想的であるように思われました。 アーカイブの作成時に圧縮をオフにすると、オーバーヘッドは小さくなりますが、コスト自体は特に重要ではありません。現時点では、永続的なストレージとは異なり、CPU時間とRAMが大量に供給されています。
nginxや他の既成のソリューションのモジュールを検索しても結果は得られませんでした-自分で実装します-タスクは難しくありません。
アーカイブには、圧縮せずに標準のzipプログラムを使用し、データをファイルに書き込みませんが、 stdoutに直接送信します。 この目的でtarを使用する方が論理的ですが、通常のユーザーがいて、多くの人にとってtarまたはtar.gzアーカイブをどうするかは謎です。
ここで、圧縮データをnginxに何らかの方法で転送する必要があります。これにより、ユーザーに提供されます。
これらの目的のために、単純なcgi-scriptがシェルに書き込まれました。
#!/bin/bash # , homeDir="/storage/media/audio" # , downloadDir=$(echo $QUERY_STRING | sed -f urldecode.sed) # pushd "$homeDir" > /dev/null # , - zip if [ -d $downloadDir ] && [ ! -z $downloadDir ] && [[ "$downloadDir" != *\/* ]] && [[ "$downloadDir" != *\\* ]] then echo "Content-Type: application/octet-stream" echo "Content-Disposition: attachment; filename=$downloadDir.zip" echo "" /usr/bin/zip -r -0 - "$downloadDir" else echo "Status: 404 Not Found" echo "Content-Type: text/html" echo "" echo "<h1>404 File not found!</h1>" fi # popd > /dev/null
スクリプトは簡単です。追加のコメントは不要だと思います。
ディレクトリ名はurlエンコードされているため、デコードします。これにはsedと小さなスクリプトを使用するため、 ここでスクリプトを取得してcgi-scriptの横に配置します。
nginxはFastCGIをサポートし、 CGIをサポートしないことを誰もが知っているので、スクリプトは引き続き機能するため、 Fcgiwrapを使用します 。
私たちは置きます:
apt-get install fcgiwrap
そして構成する:
# support for cgi scripts (require fcgiwrap) location ~ \.cgi$ { gzip off; try_files $uri =404; # pass scripts to fcgiwrap fastcgi_pass unix:/var/run/fcgiwrap.socket; # include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_ignore_client_abort off; }
nginxを再起動すると、次を使用できます: /download.cgi? ダウンロードディレクトリ名