2010-03-26 13 views
37

पर सहेजे बिना मैं उपयोगकर्ता द्वारा अपलोड की गई एक XML फ़ाइल (100kb से कम) को पढ़ने में सक्षम होना चाहता हूं, लेकिन पहले उस फ़ाइल को डेटाबेस में सहेजना नहीं है । मुझे वर्तमान कार्रवाई से पहले उस फ़ाइल की आवश्यकता नहीं है (इसकी सामग्री को पार्स किया गया है और डेटाबेस में जोड़ा गया है, हालांकि, फ़ाइल को पार्स करना समस्या नहीं है)। के बाद से स्थानीय फ़ाइलों के साथ पढ़ा जा सकता है:उपयोगकर्ता अपलोड की गई फ़ाइल को कैसे पढ़ा जाए, इसे डेटाबेस

File.read("export.opml") 

मैं बस के लिए एक file_field बनाने के बारे में सोचा: uploaded_file, तो

File.read(params[:uploaded_file]) 

साथ इसे पढ़ने के लिए कोशिश कर रहा है, लेकिन वह सब करता है एक लेखन त्रुटि फेंक है (कर सकते हैं ' स्ट्रिंग में हैशविथ इंडिफिफर एक्सेस में कनवर्ट करें)। मैंने वास्तव में कई सारी चीजों की कोशिश की है (साथ ही/tmp निर्देशिका से पढ़ने सहित), लेकिन उनमें से कोई भी काम करने के लिए नहीं मिल सकता है।

मुझे आशा है कि मेरे प्रश्न की दुर्बलता मैंने अपने आप को हल करने का प्रयास करने के लिए किए गए प्रयासों को मुखौटा नहीं किया है, लेकिन मैं इस प्रश्न को इस तरीके से प्रदूषित नहीं करना चाहता था कि इसे कैसे प्राप्त नहीं किया जाए किया हुआ। । किसी को जो में झंकार के लिए बिग धन्यवाद

यहाँ मेरे विचार है:

<% form_for(:uploaded_file, @feed, :url => {:action=>'parse'}, :html=> {:multipart=>true}) do |f| %> <p> 
    <%= f.label :uploaded_file, 'Upload your file.' %><br /> 
    <%= f.file_field :uploaded_file %> 
    </p> 
    <p><%= f.submit 'upload' %></p> 
<% end %> 

मैं एक कस्टम क्रिया (अपलोड) जो file_field अपलोड है, जो जमा करने के बाद, एक और कस्टम क्रिया के लिए रवाना पारित हो जाता है संभालती की स्थापना (पार्स) प्रसंस्करण के लिए। क्या यह मेरी समस्या का हिस्सा हो सकता है?

उत्तर

43

आप बहुत करीब हैं। वर्ग प्रकारparams[:uploaded_file] की जांच करें, यह आमतौर पर StringIO या Tempfile ऑब्जेक्ट होना चाहिए - दोनों पहले से ही फाइल के रूप में कार्य करते हैं, और उनके संबंधित read विधि (विधि) का उपयोग करके पढ़ा जा सकता है।

बस सुनिश्चित करने के लिए (params[:uploaded_file] के वर्ग प्रकार के आधार पर भिन्न है कि क्या आप संकर जाति, यात्री, Webrick आदि का उपयोग कर रहे हो सकते हैं) यदि आप एक से थोड़ा अधिक संपूर्ण प्रयास कर सकते हैं: में,

# Note: use form validation to ensure that 
# params[:uploaded_file] is not null 

file_data = params[:uploaded_file] 
if file_data.respond_to?(:read) 
    xml_contents = file_data.read 
elsif file_data.respond_to?(:path) 
    xml_contents = File.read(file_data.path) 
else 
    logger.error "Bad file_data: #{file_data.class.name}: #{file_data.inspect}" 
end 

यदि आपका मामला, यह पता चला है कि params[:uploaded_file] एक हैश है, सुनिश्चित करें कि आपने object_name और method पैरामीटर को गलत तरीके से फ़्लिप नहीं किया है, जब आपके दृश्य में file_field का आह्वान करते समय, या आपका सर्वर आपको :content_type आदि जैसे कुंजी के साथ हैश नहीं दे रहा है (जिसमें मामले से Bad file_data ... आउटपुट के साथ इस पोस्ट पर टिप्पणी करें/production.log।)

+0

हाय Vlad में! आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे बिल्कुल यकीन नहीं था कि आपके कोड का उपयोग कैसे करें। जब मैं पार्स करता हूं, तो क्या मैं किसी भी तरह file_data या xml_contents को कॉल करता हूं। जैसे मैं बस xml = फ़ाइल सेट कर रहा था।पढ़ें (पैराम्स [: अपफाइल]) तो मैं पार्स (एक्सएमएल) तो, मुझे यकीन नहीं था, लेकिन वहां रुकने के लिए कोई नहीं, मैंने कुछ अलग-अलग चीजों की कोशिश की। मैंने वेब्रिक और थिन दोनों का उपयोग करके यह देखने के लिए प्रयास किया कि क्या परिणाम समान थे ... वे थे। File.read (पैराम्स [: अपफाइल]) का उपयोग करते समय, मुझे "HashWithIndifferentAccess स्ट्रिंग में कनवर्ट नहीं किया जा सकता" क्या यह हो सकता है कि अपफ़ाइल कैसे शुरू हो जाए? "upload_file" => {"upload_file" => # <फ़ाइल: सी:/उपयोग करें ... – GoodGets

+0

जब मैं पथ xml = file.read (पैराम्स [: अपफाइल] .path का उपयोग करने का प्रयास करता हूं) मुझे एक अपरिभाषित विधि 'पथ' क्या मेरे "दृश्य" में कुछ गड़बड़ हो सकती है? मैंने इसे शामिल करने के लिए ऊपर अपना प्रश्न संपादित कर लिया है। – GoodGets

+0

मैं अपने दृश्य के साथ खेल रहा हूं। अब मैं उपयोग कर रहा हूं: <% form_for: feed,: url => {: नियंत्रक => 'फ़ीड्स',: action => 'parse'} do | f | %> और जब मैं अब अपलोड की गई फ़ाइल जमा करता हूं, तो मुझे एक टाइप एरर मिलता है "नील को स्ट्रिंग में परिवर्तित नहीं कर सकता" तो, मुझे लगता है कि कुछ सही तरीके से पारित नहीं हो रहा है। – GoodGets

6

मुझे yaml फ़ाइलों को पढ़ने की आवश्यकता है। मैं remotipart और यहाँ कोड का उपयोग करें:

html.slim

=form_tag('/locations/check_for_import', method: :post, remote: true, multipart: true) 

में ...

<input id="uploadInput" type="file" name="uploadInput"> 

नियंत्रक

content = File.read(params[:uploadInput].tempfile) 
doc = YAML.load(content) 
संबंधित मुद्दे