アイデア:
ruby eventsmachine と em-http-server gem を使用して、ファイルのダウンロード機能を提供する単純な HttpServer を完成させます。
ファイルを送信する場合、最初にヘッダーが組み立てられ、次に EM の FileStreamer が組み立てられます。 FileStreamer と呼ばれます。
コード:
require 'rubygems' require 'eventmachine' require 'em-http-server' class HTTPHandler < EM::HttpServer::Server attr_accessor :filename, :filesize, :path def process_http_request #send file async if @http_request_method.to_s =~ /GET/ && @http_request_uri.to_s.end_with?(filename) send_data "HTTP/1.1 200 OK\n" send_data "Server: XiaoMi\n" send_data "Connection: Keep-Alive\n" send_data "Keep-Alive: timeout=15\n" send_data "Content-Type: application/octet-stream\n" send_data "Content-Disposition: filename='#{filename}'\n" send_data "Content-Length: #{filesize}\n" send_data "\n" streamer = EventMachine::FileStreamer.new(self, path) streamer.callback { # file was sent successfully close_connection_after_writing } else response = EM::DelegatedHttpResponse.new(self) response.status = 200 response.content_type 'text/html' response.content = "Package HttpServer<br>usage: wget http://www.php.cn/:port/#{filename}" response.send_response end end end EM::run do path = '/tmp/aaa.tar.gz' EM::start_server("0.0.0.0", 8080, HTTPHandler) do |conn| conn.filename = File.basename(path) conn.filesize = File.size(path) conn.path = path end end
PS:eventmachineのインストールエラーについて
Windowsにeventmachineをインストールすると、常にエラーが報告されます:
Building native extensions. This could take a while... ERROR: Error installing eventmachine: ERROR: Failed to build gem native extension.
または別のエラー:
Google で長い間検索した結果、2 つの解決策が見つかりました:
1.eventmachine の以前のバージョンを使用します
このプロンプトが表示され続けますが、以下の大きなエラーがあります。これはすべて C のコンパイル エラーです。オンラインでは2つの方法があります
(1)
ERROR: Error installing ruby-debug: The 'linecache' native gem requires installed build tools. Please update your PATH to include build tools or download the DevKit from 'http://rubyinstaller.org/downloads' and follow the instructions at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'
これは下位バージョンをインストールするようです
(2)gem install
gem install eventmachine-win32
これはベータ1.0.0をインストールするようです。
2. devkit をアップグレードします
確認したところ、上記の具体的な解決策はありませんが、考えられる問題の理由は 2 つあります:
(1) C コンパイル環境がない
(2) スペースがある
上記のエラーログを見ると、コンパイル環境に問題がある可能性があることがわかりました。それで探しました。
私の Ruby はワンクリック インストーラーを使用してインストールされました。バージョンは 1.8.6-p398 です。
rubyinstallerのアドオンページでDevKitを見つけました。
DevKit の説明を見てみましょう:
//RubyGems でクールなネイティブを構築したい場合もあります
//C ベースの拡張機能をスコークせずに作成できます。
//DevKit は誰ですか!
これが私が考えていることのようです。必要 。
エラーの理由は、eventmachine をインストールするときにビルド ツールが必要ですが、それらがシステムで利用できないことです。エラー メッセージには解決策も示されています:
(1) http://rubyinstaller.org/downloads/ に移動して、開発キット – DevKit-tdm-32-4.5.1-20101214-1400-sfx.exe をダウンロードします
(2) ) http://github.com/oneclick/rubyinstaller/wiki/Development-Kit/ に従って開発キットをインストールします
主なインストール手順は次のとおりです:
古いバージョンの開発キットが既にオリジナルのバージョンにインストールされている場合システム、削除します
ダウンロード 上記の開発キットは、ダウンロードしたファイルを指定されたディレクトリ (c:/devkit など) に解凍します。 (注: ディレクトリにはスペースを含めることはできません)
ruby dk.rb を実行し、プロンプトに従って、ruby dk.rb init と Ruby dk.rb install をそれぞれ実行して、ruby を強化します
を実行できます
eventmachine --pre
成功したかどうかをテストします。
インストール手順に従って、DevKit のインストールを完了します。これは非常に簡単です。
次に、eventmachine を再度インストールします:
gem install rdiscount –platform=ruby
eventmachine を使用して HTTP サーバーにファイルのダウンロード機能を追加する Ruby の詳細については、PHP 中国語 Web サイトの関連記事に注目してください。