【问题标题】:Sinatra, progress bar in upload formSinatra,上传表单中的进度条
【发布时间】: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-idTempfile 和总大小的关联。

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] = {... 行末尾缺少 }

标签: ruby iframe file-upload sinatra mongrel


【解决方案1】:

我想我明白了问题所在:

tmp = params[:file][:tempfile] 在文件完全接收之前不会返回。

【讨论】:

    【解决方案2】:
    @@assoc[@sid] = { :file => tmp, :size => env['CONTENT_LENGTH'] }
    

    应该是

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

    【讨论】:

    • 是的,这是问题中的拼写错误,在真正的应用程序中没问题。无论如何感谢您的报告。
    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多