asy*_*ric 10 ruby iframe mongrel file-upload sinatra
我正在开发一个包含上传表单的Sinatra应用程序,其中包含一个进度条,指示已完成上载的内容.如ryan dahl所述,该过程如下:
HTTP上传进度条相当混淆 - 它们通常涉及在服务器上运行的进程,跟踪HTTP服务器正在写入的临时文件的大小,然后在客户端,每隔几秒就向服务器发出一次AJAX调用.上传以询问上传进度.
每个上传都有一个随机的session-id,并跟踪我class variable在我的应用程序中使用的关联(我知道,这太可怕了 - 如果你有更好的想法,请告诉我)
configure do
@@assoc = {}
end
Run Code Online (Sandbox Code Playgroud)
我有一个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
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
问题是,直到POST请求没有完成(即,在它已经读完所有之后Tempfile)h.nil?返回true,这实际上没有意义,因为我刚刚@@assoc[@sid]在另一条路线中分配了一个值.
那么,我在这里错过了什么?
编辑:我试过了
set :reload, false set :environment, :productionconfig { @@assoc ||= {} }都没有奏效.
| 归档时间: |
|
| 查看次数: |
1808 次 |
| 最近记录: |