サイトユーザーによるディレクトリのダウンロードの可能性の実現

アルバムによって音楽がレイアウトされている小さな閉じたサイトがあり、サイトユーザーはブラウザから直接これらのアルバムを聴く機会があります。 サーバーでは、アルバムはディレクトリの形式で保存され、その中には音楽自体が保存され、プレーヤーの要求に応じてnginxに提供されます。

ユーザーが好きなアルバム全体を自分のコンピューターにダウンロードするまで、すべてがうまくいきました。



猫の下で、これをどのように実装したかを説明します。



頭に浮かぶ最初の決定は、各アルバムのアーカイブを作成してユーザーに提供することです。

このオプションを放棄した主な理由は、たくさんの音楽があり、各アルバムのアーカイブを作成することは、ディスク容量に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? ダウンロードディレクトリ名



All Articles