7

मैं रेल 3.1.0.rc8 और क्रोमियम 15.0.874.102 का उपयोग कर रहा हूं।रेल में, सामग्री-स्वभाव फ़ाइल नाम को ओवरराइड करने में असमर्थ

मैं एक CSV डाउनलोड का फ़ाइल नाम सेट करना चाहता हूं। मैं इस SO solution का अनुसरण कर रहा हूं, लेकिन Content-Disposition हेडर के filename को संशोधित करने में असमर्थ हूं।

यहाँ मेरी कोड है:

respond_to do |format| 
    format.html 
    format.csv do 
    render_csv(:basename => "my_filename") 
    Rails.logger.debug "HEADERS: #{headers.to_s}" 
    end 
end 

मेरी लॉग में:

module ActionController 
    module CSVHelper 

    def render_csv options={} 
     if request.env['HTTP_USER_AGENT'] =~ /msie/i 
     headers['Pragma'] = "public" 
     headers['Content-Type'] = "text/plain" 
     headers['Cache-Control'] = "no-cache, must-revalidate, post-check=0, pre-check=0" 
     headers['Expires'] = "0" 
     else 
     headers['Content-Type'] = "text/csv" 
     end 

     filename = generate_filename options.delete(:basename) 
     headers['Content-Disposition'] = "attachment; filename=#{filename}" 
    end 

    def generate_filename basename=nil, suffix="csv" 
     filename = basename || params[:action] 
     filename << ".#{suffix}" 
     filename 
    end 

    end 
end  

और मेरे नियंत्रक में

[2011-11-28 12:25:49.611] DEBUG - HEADERS: {"Content-Type"=>"text/csv", "Content-Disposition"=>"attachment; filename=my_filename.csv"} 

क्रोमियम नेटवर्क निरीक्षक उपकरण में, मैं में निम्न देखें मेरे प्रतिक्रिया शीर्षलेख:

Content-Type: text/plain 
Content-Disposition: attachment; filename=index.csv 

यदि मैं को foo/bar जैसे कुछ में बदलता हूं, तो मुझे लगता है कि परिवर्तन मेरे नेटवर्क इंस्पेक्टर टूल में आया है। इससे कोई फर्क नहीं पड़ता कि मैंने filename को सेट किया है, यह index.csv है।

धन्यवाद, मैक्स

+0

क्या आपके पास सही तरीके से सेट अप है? – baol

+0

दृश्य अपेक्षित के रूप में प्रस्तुत करता है, यदि आपका यही मतलब है; डाउनलोड की गई फ़ाइल की सामग्री मुझे लगता है कि मैं – maxenglander

उत्तर

11

Content-Disposition section of the appendices to the HTTP/1.1 specification के अनुसार फ़ाइल नाम एक उद्धृत स्ट्रिंग होना चाहिए:

filename-parm = "filename" "=" quoted-string 
    ... 

एक उदाहरण

Content-Disposition: attachment; filename="fname.ext" 

है तो आप शायद (निम्न परिवर्तन करने की आवश्यकता टिप्पणी उद्धरण चिह्न):

headers['Content-Disposition'] = "attachment; filename=\"#{filename}\"" 
+0

चाहता हूं ध्यान दें कि अगर फ़ाइल नाम में उद्धरण हो सकते हैं, तो आपको उन्हें बचाना होगा - 'filename.gsub (/ "/,' \\" ') ' – gmcnaughton

2

मुझे पता चला कि मेरी टीम csv_builder मणि, जो आप नियंत्रक में @filename की स्थापना द्वारा डाउनलोड की गई फ़ाइल के नाम को समायोजित करने की अनुमति देता है का उपयोग कर रहा है। अभी भी किसी को भी सही उत्तर देगा जो समझा सकता है कि मुझे ओपी में वर्णित व्यवहार क्यों मिल रहा था।

1

मुझे नहीं लगता कि आप वास्तव में आउटपुट भेज रहे/प्रस्तुत कर रहे हैं ... क्या वह .csv.erb फ़ाइल या कुछ में है? या csv_builder का उपयोग अन्य उत्तर के रूप में करते हैं? यह चाल हो सकती है।

मैं एक .xlsx आउटपुट को प्रस्तुत करने वाली एक ही चीज़ के साथ आया था। एक बार जब डिस्क पर फ़ाइल हो गई, तो मैं यह कर सकता था:

def example 
    respond_to do |format| 
    format.xlsx do 
     path = some_method_generating_xlsx_file 
     headers['Content-Disposition'] = "attachment; filename=test.xlsx" 
     render :text => File.binread(path), :content_type => XLSX_MIME_TYPE 
    end 
    end 
end 

मेरे नियंत्रक में, और यह ठीक काम करता था। शायद हेडर टेम्पलेट प्रतिपादन द्वारा clobbered किया जा रहा था।

0

मैं इस प्रकार की सामग्री के लिए व्यक्तिगत रूप से render का उपयोग नहीं करता - मैं send_data का उपयोग करना पसंद करता हूं। यहां एक उदाहरण दिया गया है:

send_data data, :type => 'text/csv', :disposition => 'attachment; filename=my_file_name.csv' 
संबंधित मुद्दे