Sinatra,上传表单中的进度条
Posted
技术标签:
【中文标题】Sinatra,上传表单中的进度条【英文标题】:Sinatra, progress bar in upload form 【发布时间】:2011-03-06 23:21:21 【问题描述】:我正在开发一个包含上传表单的 Sinatra 应用程序,其中有一个进度条指示上传完成了多少。 如ryan dahl 所述,该过程如下:
HTTP 上传进度条相当模糊 - 它们通常涉及在服务器上运行的进程,跟踪 HTTP 服务器正在写入的临时文件的大小,然后在客户端每隔几秒钟进行一次 AJAX 调用以服务器在上传过程中询问上传进度。
每次上传都有一个随机的session-id
,为了跟踪关联,我在我的应用中使用了class variable
(我知道,这太可怕了——如果你有更好的想法,请告诉我)
configure do
@@assoc =
end
我有一个用于上传的POST
路由和一个用于AJAX 轮询的GET
。
在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] = ...
行末尾缺少
。
【参考方案1】:
我想我明白了问题所在:
tmp = params[:file][:tempfile]
在文件完全接收之前不会返回。
【讨论】:
【参考方案2】:@@assoc[@sid] = :file => tmp, :size => env['CONTENT_LENGTH']
应该是
@@assoc[params[:sid]] = :file => tmp, :size => env['CONTENT_LENGTH']
【讨论】:
是的,这是问题中的拼写错误,在真正的应用程序中没问题。无论如何感谢您的报告。以上是关于Sinatra,上传表单中的进度条的主要内容,如果未能解决你的问题,请参考以下文章