Ruby on Rails Webファイルアップロードインジケーター

目的:さまざまな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



  1. ActionController ::ルーティング :: Routes.draw do | map |
  2. map.root:コントローラー=> 'home'
  3. map.upload '/ upload' 、:controller => 'home' 、:action => 'upload'
  4. map.progress '/ progress' 、:controller => 'home' 、:action => 'progress'
  5. 終わり




準備フェーズが完了しました。 次に、ファイルアップロードインジケータの機能を少し説明する必要があります。 フォームの送信はiframeに移動し、ページ自体からのajaxリクエストを使用して、現在の状態を返す特定のコントローラーに連絡するために適切な頻度を使用できます(json、html、javascriptを使用できます)、ページに応じてインジケータを移動します。



そのため、コントローラーは1つだけで、3つのメソッドがあります。アップロード用のフォームを表示するためのインデックス、アップロード-ダウンロードしたファイルの処理、進行状況-ダウンロードステータスに関するデータを取得するためです。 コントローラは次のとおりです。



Copy Source | Copy HTML



  1. クラス HomeController <ApplicationController
  2. skip_before_filter:verify_authenticity_token ,: only => [: progress ]
  3. def インデックス
  4. @upid = Time .now.tv_sec.to_s
  5. 終わり
  6. def upload
  7. レンダリング:テキスト=> '完了'
  8. 終わり
  9. デフ 進捗
  10. @status = Mongrel :: Uploads.check(params [:upload_id])
  11. respond_to do | フォーマット |
  12. format .js
  13. 終わり
  14. 終わり
  15. 終わり




リクエストはトークンなしで送信されるため、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



  1. クラス Upload <GemPlugin ::プラグイン"/ handlers"
  2. Mongrelを 含める :: HttpHandlerPlugin
  3. def 初期化 (オプション= {})
  4. @path_info = 配列 (オプション[:path_info])
  5. @frequency =オプション[:頻度] || 3
  6. @request_notify = true
  7. ifオプション[:drb]
  8. 「drb」が 必要
  9. DRb.start_service
  10. Mongrel .const_set:アップロード、DRbObject。 新規nil 、オプション[:drb])
  11. 他に
  12. Mongrel .const_set:アップロード、 Mongrel :: UploadProgress.new
  13. 終わり
  14. Mongrel :: Uploads.debug = true if options [:debug]
  15. 終わり
  16. def request_begins (パラメーター)
  17. upload_notify (: add 、params、params [ Mongrel :: Const :: CONTENT_LENGTH] .to_i)
  18. 終わり
  19. def request_progress (params、clen、total)
  20. upload_notify (: mark 、params、clen)
  21. 終わり
  22. def プロセス (要求、応答)
  23. upload_notify (: finish 、request.params)
  24. 終わり
  25. プライベート
  26. def upload_notify (action、params、* args)
  27. @path_infoを除いて戻ります。 include ?(params [ 'PATH_INFO' ])&&
  28. params [ Mongrel :: Const :: REQUEST_METHOD] == 'POST' &&
  29. upload_id = Mongrel :: HttpRequest.query_parse(params [ 'QUERY_STRING' ])[ 'upload_id' ]
  30. アクション==: マークの 場合
  31. last_checked_time = Mongrel ::アップロード。 last_checked (upload_id)
  32. last_checked_time && Time .now-last_checked_time> @frequencyを除いて戻る
  33. 終わり
  34. Mongrel :: Uploads.send(action、upload_id、* args)
  35. Mongrel ::アップロード。 action ==: finishで ない限り、 update_checked_time (upload_id)
  36. 終わり
  37. 終わり
  38. #現在処理中のすべてのアップロードのステータスを追跡します
  39. クラス Mongrel :: UploadProgress
  40. attr_accessor:デバッグ
  41. def 初期化
  42. @guard = Mutex .new
  43. @counters = {}
  44. 終わり
  45. def チェック (有効)
  46. @counters [上] .last rescue nil
  47. 終わり
  48. def last_checked (有効)
  49. @counters [上] .first rescue nil
  50. 終わり
  51. def update_checked_time (upid)
  52. @ guard.synchronize {@counters [upid] [ 0 ] = Time .now}
  53. 終わり
  54. def add (有効、サイズ)
  55. @ guard.synchronize do
  56. @counters [upid] = [ Time .now、{:size => size ,: received => 0 }]
  57. @debugの 場合、 「#{upid}:Added」 入力します
  58. 終わり
  59. 終わり
  60. def マーク (upid、len)
  61. status = check (upid)でない限り戻ります
  62. @debugの 場合、 「#{upid}:Marking」を置きます
  63. @ guard.synchronize {status [:received] = status [:size]-len}
  64. 終わり
  65. def finish (upid)
  66. @ guard.synchronize do
  67. @debugの 場合、 「#{upid}:Finished」を置きます
  68. @カウンター。 削除 (無効)
  69. 終わり
  70. 終わり
  71. def リスト
  72. @ counters.keys.sort
  73. 終わり
  74. 終わり




その後、このプラグインをmongrelに接続するmongrel(基本的には通常のrubyファイル)の構成を作成します。

touch config/mongrel_upload_progress.conf









以下をmongrel_upload_progress.confに追加します。

Copy Source | Copy HTML



  1. 'progress_plugin'が 必要
  2. 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に置き換えます。 それらについては後で記事を書く予定です。



参照リスト



雑種のアップロードの進行状況




All Articles