我正在開發一個Sinatra應用程序,它由一個上傳表單和一個進度條組成,表示已經完成了多少上傳。 的方法,如ryan dahl描述如下:Sinatra,進度條上傳表格
HTTP上傳進度條而obfuscated-他們通常涉及在服務器上運行的進程保持臨時文件的大小,HTTP服務器是寫作的軌道然後在客戶端,在上傳過程中每隔幾秒向服務器發送一次AJAX調用以詢問上傳的進度。
每個上傳具有隨機session-id
,並跟蹤該協會的我使用我的應用程序一個class variable
(我知道,這是可怕的 - 如果你有更好的想法,請告訴我)
configure do
@@assoc = {}
end
我有一個POST
路由的上傳,和GET
一個用於AJAX輪詢。 在POST
路線裏面,我保存了session-id
,Tempfile
和總大小的關聯。
post '/files' do
tmp = params[:file][:tempfile]
# from here on, @@assoc[@sid] should have a value, even in other routes
@@assoc[@sid] = { :file => tmp, :size => env['CONTENT_LENGTH'] }
File.open("#{options.filesdir}/#{filename}", 'w+') do |file|
file << tmp.read
end
end
在GET
路線,我計算基於所述Tempfile
的電流的大小的百分比:
get '/status/:sid' do
h = @@assoc[params[:sid]]
unless h.nil?
percentage = (h[:file].size/h[:size].to_f) * 100
"#{percentage}%"
else
"0%"
end
end
的問題是,直到POST
請求尚未完成(它有即,後閱讀全部Tempfile
)h.nil?
返回true
,這並沒有什麼意義,因爲我剛剛在另一條路線中分配了@@assoc[@sid]
值。
那麼,我在這裏錯過了什麼?
編輯:我試過
set :reload, false
set :environment, :production
config { @@assoc ||= {} }
- 我也試圖在它拋出一個關係數據庫(與DataMapper的SQLite的)
都沒有工作。
'@@ assoc [@sid] = {...'行末尾沒有'}'行。 – Adrian 2010-06-22 18:32:30
固定,謝謝:) – asymmetric 2010-06-22 18:36:56