我正在开发一个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