2010-06-22 18 views
10

मैं एक सिनात्रा ऐप विकसित कर रहा हूं जिसमें एक अपलोड फॉर्म होता है, जिसमें प्रगति पट्टी के साथ संकेत मिलता है कि अपलोड कितना पूरा हो गया है। प्रक्रिया, के रूप में 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)
की कोशिश की कोशिश की है

न तो काम किया।

+0

'@@ assoc [@sid] = {...' लाइन अंत में '}' गायब है। – Adrian

+0

तय, धन्यवाद :) – asymmetric

उत्तर

4

होना चाहिए मुझे लगता है कि मुझे मिल गया कि समस्या क्या है:

tmp = params[:file][:tempfile] वापस नहीं करता है जब तक पूरी तरह से फ़ाइल प्राप्त हो गया है।

+0

सच है, क्या आपको इस समस्या पर एक समाधान मिला है? – dombesz

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

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

हाँ, यह प्रश्न में एक टाइपो है, यह वास्तविक ऐप में ठीक है। रिपोर्टिंग के लिए वैसे भी धन्यवाद। – asymmetric

संबंधित मुद्दे