मैं एक सिनात्रा ऐप विकसित कर रहा हूं जिसमें एक अपलोड फॉर्म होता है, जिसमें प्रगति पट्टी के साथ संकेत मिलता है कि अपलोड कितना पूरा हो गया है। प्रक्रिया, के रूप में ryan dahl वर्णन करते हैं, निम्नलिखित है:सिनात्रा, अपलोड फॉर्म में प्रगति पट्टी
HTTP अपलोड प्रगति सलाखों बल्कि obfuscated- वे आम तौर पर शामिल कर रहे हैं एक प्रक्रिया tempfile के आकार कि HTTP सर्वर लिख रहा है का ट्रैक रखने के सर्वर पर चल रहा फिर, क्लाइंट पक्ष पर अपलोड की प्रगति के लिए अपलोड करने के दौरान अपलोड के दौरान प्रत्येक जोड़े को सर्वर पर प्रत्येक जोड़े को बनाया जाता है।
हर अपलोड एक यादृच्छिक session-id
है, और संघ का ट्रैक रखने के मैं को रोजगार मेरे एप्लिकेशन में एक class variable
(मुझे पता है, कि भयानक है - अगर आप बेहतर विचार मिल गया है, कृपया मुझे बताओ)
configure do
@@assoc = {}
end
मेरे पास अपलोड के लिए POST
मार्ग है, और AJAX मतदान के लिए GET
एक है। POST
मार्ग के अंदर मैं session-id
, 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
अनुरोध पूरा नहीं किया है (यह है यानी, के बाद कि:
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
के वर्तमान आकार के आधार पर प्रतिशत की गणना Tempfile
के सभी को पढ़ें) h.nil?
true
लौटाता है, जो वास्तव में समझ में नहीं आता है क्योंकि मैंने दूसरे मार्ग में @@assoc[@sid]
एक मान असाइन किया है।
तो, मैं यहां क्या खो रहा हूं?
संपादित करें: मैं
set :reload, false
set :environment, :production
config { @@assoc ||= {} }
- मैं भी उस पर एक संबंधपरक डाटाबेस फेंक (DataMapper साथ SQLite)
न तो काम किया।
'@@ assoc [@sid] = {...' लाइन अंत में '}' गायब है। – Adrian
तय, धन्यवाद :) – asymmetric