ruby - Sinatra,上传表单中的进度条

标签 ruby iframe file-upload sinatra mongrel

我正在开发一个 Sinatra 应用程序,它包含一个上传表单,并带有一个进度条,指示上传完成了多少。 该过程,如 ryan dahl 所述, 如下:

HTTP upload progress bars are rather obfuscated- they typically involve a process running on the server keeping track of the size of the tempfile that the HTTP server is writing to, then on the client side an AJAX call is made every couple seconds to the server during the upload to ask for the progress of the upload.

每次上传都有一个随机的 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,这实际上没有意义,因为我刚刚在另一条 route 为 @@assoc[@sid] 分配了一个值。

那么,我在这里缺少什么?

编辑:我试过了

  • 设置:reload, false
  • 设置:环境,:生产
  • 配置{@@assoc ||= {} }
  • 我还尝试向它添加一个关系数据库(带有 DataMapper 的 SQLite)

均无效。

最佳答案

我想我明白问题是什么了:

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

关于ruby - Sinatra,上传表单中的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3095936/

相关文章:

go - 如何使用 gin 框架将文件上传到 amazon s3

ruby-on-rails - ruby - uniq 有什么区别!和独特的

ruby - 如何从 url 获取文件扩展名?

html - 编辑 iframe 中元素的 CSS

javascript - 可以在没有 cookie 数据的情况下创建 iframe 吗?

jquery - 使用Uploadify(或其他方式)上传整个目录

javascript - 如何为文本区域中的单词添加标题?

ruby - 在 Ruby 中替代救援?

javascript - 访问 iframe 外部的元素

java - 如何在HttpRequest中获取源文件以上传文件