gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:59 27 4
gpt4 key购买 nike

我正在开发一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com