目的:さまざまなRuby on Rails構成にファイルダウンロードインジケーターを実装する方法を示します。
一連の記事を3つの部分に分けます。
雑種
雑種(s)+ nginx
mod_rails
以下でチェック:
Ruby on Rails 2.2.2
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
mongrel 1.1.5
Mac OS X 10.5.6
パートI.雑種でこれを行う方法
この記事は最後にあるリンクに基づいています。 しかし、私の新しいレールとmnogrelsでそれを繰り返しても何も起こりませんでした。 少し変更しました。
フレーム構築:
rails upload
cd upload
rm public/index.html
script/generate controller home index upload progress
touch app/views/layouts/application.html.erb
ルートの追加:
Copy Source | Copy HTML
- ActionController ::ルーティング :: Routes.draw do | map |
- map.root:コントローラー=> 'home'
- map.upload '/ upload' 、:controller => 'home' 、:action => 'upload'
- map.progress '/ progress' 、:controller => 'home' 、:action => 'progress'
- 終わり
準備フェーズが完了しました。 次に、ファイルアップロードインジケータの機能を少し説明する必要があります。 フォームの送信はiframeに移動し、ページ自体からのajaxリクエストを使用して、現在の状態を返す特定のコントローラーに連絡するために適切な頻度を使用できます(json、html、javascriptを使用できます)、ページに応じてインジケータを移動します。
そのため、コントローラーは1つだけで、3つのメソッドがあります。アップロード用のフォームを表示するためのインデックス、アップロード-ダウンロードしたファイルの処理、進行状況-ダウンロードステータスに関するデータを取得するためです。 コントローラは次のとおりです。
Copy Source | Copy HTML
- クラス HomeController <ApplicationController
- skip_before_filter:verify_authenticity_token ,: only => [: progress ]
- def インデックス
- @upid = Time .now.tv_sec.to_s
- 終わり
- def upload
- レンダリング:テキスト=> '完了'
- 終わり
- デフ 進捗
- @status = Mongrel :: Uploads.check(params [:upload_id])
- respond_to do | フォーマット |
- format .js
- 終わり
- 終わり
- 終わり
リクエストはトークンなしで送信されるため、skip_before_filterが必要です。 @upidは一意の識別子です。
次に、ファイルのアップロード(より具体的には特定のURLへのアクセス)をインターセプトし、ダウンロードステータスに関するデータを保存する、mongrel用のプラグインを作成する必要があります。さらに、何らかの方法でこのデータにアクセスする必要があります。 これが既に実装されており、コードがsvnから取得できるのは良いことです。
svn co svn://rubyforge.org/var/svn/mongrel/trunk/projects/mongrel_upload_progress
次のようにすることをお勧めします。次の内容のlib / progress_plugin.rbファイルを作成します。
Copy Source | Copy HTML
- クラス Upload <GemPlugin ::プラグイン"/ handlers"
- Mongrelを 含める :: HttpHandlerPlugin
- def 初期化 (オプション= {})
- @path_info = 配列 (オプション[:path_info])
- @frequency =オプション[:頻度] || 3
- @request_notify = true
- ifオプション[:drb]
- 「drb」が 必要
- DRb.start_service
- Mongrel .const_set:アップロード、DRbObject。 新規 ( nil 、オプション[:drb])
- 他に
- Mongrel .const_set:アップロード、 Mongrel :: UploadProgress.new
- 終わり
- Mongrel :: Uploads.debug = true if options [:debug]
- 終わり
- def request_begins (パラメーター)
- upload_notify (: add 、params、params [ Mongrel :: Const :: CONTENT_LENGTH] .to_i)
- 終わり
- def request_progress (params、clen、total)
- upload_notify (: mark 、params、clen)
- 終わり
- def プロセス (要求、応答)
- upload_notify (: finish 、request.params)
- 終わり
- プライベート
- def upload_notify (action、params、* args)
- @path_infoを除いて戻ります。 include ?(params [ 'PATH_INFO' ])&&
- params [ Mongrel :: Const :: REQUEST_METHOD] == 'POST' &&
- upload_id = Mongrel :: HttpRequest.query_parse(params [ 'QUERY_STRING' ])[ 'upload_id' ]
- アクション==: マークの 場合
- last_checked_time = Mongrel ::アップロード。 last_checked (upload_id)
- last_checked_time && Time .now-last_checked_time> @frequencyを除いて戻る
- 終わり
- Mongrel :: Uploads.send(action、upload_id、* args)
- Mongrel ::アップロード。 action ==: finishで ない限り、 update_checked_time (upload_id)
- 終わり
- 終わり
- #現在処理中のすべてのアップロードのステータスを追跡します
- クラス Mongrel :: UploadProgress
- attr_accessor:デバッグ
- def 初期化
- @guard = Mutex .new
- @counters = {}
- 終わり
- def チェック (有効)
- @counters [上] .last rescue nil
- 終わり
- def last_checked (有効)
- @counters [上] .first rescue nil
- 終わり
- def update_checked_time (upid)
- @ guard.synchronize {@counters [upid] [ 0 ] = Time .now}
- 終わり
- def add (有効、サイズ)
- @ guard.synchronize do
- @counters [upid] = [ Time .now、{:size => size ,: received => 0 }]
- @debugの 場合、 「#{upid}:Added」 と入力します
- 終わり
- 終わり
- def マーク (upid、len)
- status = check (upid)でない限り戻ります
- @debugの 場合、 「#{upid}:Marking」を置きます
- @ guard.synchronize {status [:received] = status [:size]-len}
- 終わり
- def finish (upid)
- @ guard.synchronize do
- @debugの 場合、 「#{upid}:Finished」を置きます
- @カウンター。 削除 (無効)
- 終わり
- 終わり
- def リスト
- @ counters.keys.sort
- 終わり
- 終わり
その後、このプラグインをmongrelに接続するmongrel(基本的には通常のrubyファイル)の構成を作成します。
touch config/mongrel_upload_progress.conf
以下をmongrel_upload_progress.confに追加します。
Copy Source | Copy HTML
- 'progress_plugin'が 必要
- uri "/" 、:handler => plugin( '/ handlers / upload' 、:path_info => '/ upload' ),: in_front => true
path_infoは、ロードステータスを監視するためにプラグインによってインターセプトされるルートです。
ダウンロードフォームとすべての必要なjs-nicknamesは、
ここから取得でき
ます 。
構成ファイルを使用してMongrelを実行するだけです。
mongrel_rails start -S config/mongrel_upload_progress.conf
ブラウザのインジケータは次のようになります。
いくつかの雑種drbを使用できる場合、詳細は以下のリンクで説明されています。
この記事のフレームワークでは、表面的な変更は行いませんでした。 より美しいフォームでは、
rghost.ruでインジケーターを表示できます。
もちろん、単純な雑種で管理している人はほとんどいないため、このすべてが無駄に書かれている可能性が最も高いことを認めるのは残念です。 通常、彼らはnginxを雑種の前に置くか、一般的にmod_passengerでapacheに置き換えます。 それらについては後で記事を書く予定です。
参照リスト
雑種のアップロードの進行状況