2010-06-22 63 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