質問

次のコントローラーコードを使用して、TMPディレクトリにファイルを作成しました。

  def download
    file_path = "#{RAILS_ROOT}/tmp/downloads/xxx.html"
    data = render_to_string( :action => :show, :layout => nil )
    File.open(file_path, "w"){|f| f << data }
    flash[:notice] = "saved to #{file_path}"
  end

これにより、TMPディレクトリに必要なファイルが作成されます。ユーザーにそのファイルをダウンロードさせることです。

私のローカルマシンでは、ファイルは次のようなパスに保存されます。

/Users/xxxx/Documents/Sites/xxxx/Website/htdocs/tmp/downloads/xxxx.html

そして、ライブサーバーでは、このURLはまったく異なるものになります。

私が疑問に思っていたのは、ユーザーにこのxxxx.htmlをダウンロードさせるにはどうすればよいですか?

PSを入れたら...

redirect_to file_path

...コントローラーでは、私には見つかりません。

乾杯。

役に立ちましたか?

解決

を見てください ファイルを送信 方法。このように見えるでしょう:

send_file Rails.root.join('tmp', 'downloads', 'xxxxx.html'), :type => 'text/html', :disposition => 'attachment'

:dision => '添付ファイル'は、ブラウザにファイルをレンダリングする代わりにダウンロードさせます。ブラウザにロードしたい場合は、「インライン」に設定します。 nginxがRailsアプリの前にいる場合、環境構成を変更する必要があります(つまり、環境/production.rb):

# For nginx:
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'

他のヒント

ファイルパスをURLと混同するのは簡単ですが、重要な区別です。のURLパスがあるもの /a/b.txt 実際にはシステムパスにあります #{Rails.root}/public/a/b.txt したがって、両方をタンデムで生成することにより、これに対処する必要がある場合があります。

これがあなたの対処方法です:

def download
  base_path = "downloads/xxx.html"

  system_path = File.expand_path("public/#{base_path}", Rails.root)
  url_path = "/#{base_path}"

  File.open(file_path, "w") do |f|
    f.puts render_to_string(:action => :show, :layout => nil)
  end

  flash[:notice] = "saved to #{base_path}"

  redirect_to(url_path)
end

Webサーバーを介して公開されていないリソースにリダイレクトすることはできません。 public/ このように設定されています。それに応じてサーバーを構成する場合、追加のパスを含めることができます。

また、必要に応じて、ダウンロード可能なインラインアタッチメントとして応答を単にレンダリングするだけで、このプロセス全体をサイドステップすることもできます。

render(:action => :show, :layout => nil, :content_type=> 'application/octet-stream')
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top