加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – Sinatra,进度条在上传形式

发布时间:2020-12-16 22:33:03 所属栏目:百科 来源:网络整理
导读:我正在开发一个由上传表单组成的Sinatra应用程序,进度条指示上传的内容已经完成. 如 ryan dahl所述,这个过程如下: HTTP upload progress bars are rather obfuscated- they typically involve a process running on the server keeping track of the size o
我正在开发一个由上传表单组成的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.

每次上传都有一个随机的会话ID,并跟踪我在应用程序中使用一个类变量的关联(我知道这太可怕了 – 如果你有更好的想法,请告诉我)

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 || = {}}
>我也试过在它上面抛出一个关系数据库(SQLite with DataMapper)

没有工作.

解决方法

我想我有什么问题是:

tmp = params [:file] [:tempfile]不会返回,直到文件被完全收到.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读