2010-06-22 61 views
10

我正在開發一個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請求尚未完成(它有即,後閱讀全部Tempfileh.nil?返回true,這並沒有什麼意義,因爲我剛剛在另一條路線中分配了@@assoc[@sid]值。

那麼,我在這裏錯過了什麼?

編輯:我試過

  • set :reload, false
  • set :environment, :production
  • config { @@assoc ||= {} }
  • 我也試圖在它拋出一個關係數據庫(與DataMapper的SQLite的)

都沒有工作。

+0

'@@ assoc [@sid] = {...'行末尾沒有'}'行。 – Adrian 2010-06-22 18:32:30

+0

固定,謝謝:) – asymmetric 2010-06-22 18:36:56

回答

4

我想我的問題是什麼:

tmp = params[:file][:tempfile]不會返回,直到該文件已被完全接收。

+0

是的,你有沒有找到解決這個問題的方法? – dombesz 2011-07-06 08:37:09

1
@@assoc[@sid] = { :file => tmp, :size => env['CONTENT_LENGTH'] } 

應該

@@assoc[params[:sid]] = { :file => tmp, :size => env['CONTENT_LENGTH'] } 
+0

是的,這是一個錯誤的問題,沒關係在真正的應用程序。 無論如何要報告。 – asymmetric 2010-06-22 18:38:41