2010-06-22 2 views
10

Я разрабатываю приложение 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)

Ничего не работало.

+0

В конце строки '@ @ assoc [@sid] = {...' отсутствует '}'. – Adrian

+0

исправлено, спасибо :) – asymmetric

ответ

4

Я думаю, что я получил то, что проблема:

tmp = params[:file][:tempfile] не возвращается, пока файл не был полностью получен.

+0

true, вы нашли решение этой проблемы? – dombesz

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

должен быть

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

Да, это опечатка в вопросе, все в порядке в реальном приложении. спасибо в любом случае за сообщение. – asymmetric

Смежные вопросы