7

Rails 3.1.0.rc8とChromium 15.0.874.102を使用しています。in rails、コンテンツ処理ファイル名を無効にすることはできません

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 

Content-Typefoo/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

は、私は私のチームは、あなたがコントローラで@filenameを設定することにより、ダウンロードしたファイルの名前を調整することができますcsv_builder宝石を、使用していることが分かりました。なぜ私がOPに記載されている行動を得ていたのかを説明できる人には、正しい答えが与えられます。

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 

私のコントローラで、それはうまくいきました。おそらく、テンプレートレンダリングによってヘッダーが詰まっていた可能性があります。

0

私は個人的にこの種類のコンテンツにrenderを使用しません。send_dataを使用することをお勧めします。ここに例があります:

send_data data, :type => 'text/csv', :disposition => 'attachment; filename=my_file_name.csv' 
関連する問題