Я разрабатываю приложение Sinatra, состоящее из формы загрузки, с индикатором выполнения, показывающим, сколько загрузки завершено. Процесс, как описано ryan dahl, заключается в следующем:Sinatra, индикатор выполнения в форме загрузки
HTTP загрузить прогресс бары, а obfuscated- они, как правило, связаны с процессом, запущенным на сервере отслеживания размера TempFile, что сервер HTTP пишет а затем на стороне клиента вызов AJAX выполняется каждые пару секунд на сервере во время загрузки, чтобы запросить ход загрузки.
Каждая загрузка имеет случайный session-id
и отслеживать ассоциации я использовать в моем приложении к class variable
(я знаю, что это ужасно - если у вас есть идеи получше, пожалуйста, скажите мне)
configure do
@@assoc = {}
end
У меня есть маршрут для загрузки и 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
«s:
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]
значение на другом маршруте.
Итак, что мне здесь не хватает?
EDIT: Я попытался
set :reload, false
set :environment, :production
config { @@assoc ||= {} }
- Я также попытался бросить реляционную БД на него (SQLite с DataMapper)
Ничего не работало.
В конце строки '@ @ assoc [@sid] = {...' отсутствует '}'. – Adrian
исправлено, спасибо :) – asymmetric