Railsアプリケーションでダウンロードしたファイルのファイル名を設定する
-
03-07-2019 - |
質問
ユーザーが拡張子.pptのファイルをダウンロードできるようにするコントローラーアクションがあります。それは実際にはPowerPointバイナリではなく、PowerPointが読み取れるXML風の形式にすぎません。このファイルはElementsControllerというコントローラーのshowアクションからダウンロードされますが、showアクションは実際にはコントローラーで定義されていませんが、app / views / elements / show.ppt.builderにはそのためのテンプレートファイルがあります。 Mime :: Typeがconfig / initializers / mime_types.rbに登録されています:
Mime :: Type.register" multipart / related"、:ppt
ファイルが適切にダウンロードされ、Windowsシステムでpowerpointで開きますが、問題はファイル名です。ファイルの名前は3.pptで、3はURLのidパラメーターです。ファイル名を3.pptよりもわかりやすい名前に設定する方法があるかどうかを知りたい。
thx、
-C
解決
send_data を使用できます:
send_data pptdata, :filename => 'your_file_name.ppt',
:disposition => 'inline', :type => "multipart/related"
これのもう1つの利点は、x-sendfileを使用できることです。これにより、クライアントがデータをダウンロードしている間、あなたは雑種/シンが待っていません。
別のオプションは、次のようなルートを持つことです:
/elements/3/files/foo.ppt
次に、FilesControllerのshowメソッドで、idパラメータを何でも送信できます。
他のヒント
可能な例:
def show
@item = Item.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.ppt {
response.headers['Content-Disposition'] = "attachment; filename=\"#{@item.filename}.ppt\""
} # show.ppt.erb
format.xml { render :xml => @item }
end
end
わかりました。これは非常に古い質問に対する答えですが、Rails 3.2の時点で最も簡単な方法は次のように設定することです。
respond_to do |format|
format.html # index.html.erb
format.json { render json: @product }
format.csv { send_data @product.to_csv, :filename => "New-Product-filename.csv" }
format.xls
end