I have a controller action that allows a user to download a file with an extension of .ppt . It's not really a powerpoint binary, just an xml-ish format that powerpoint can read. the file is downloaded from the show action of a controller called ElementsController, but the show action is not actually defined in the controller, there is, however, a template file for it in app/views/elements/show.ppt.builder . I have the Mime::Type registered in config/initializers/mime_types.rb as such:
Mime::Type.register "multipart/related", :ppt
and the file downloads properly, and opens with powerpoint on a windows system, yet the problem is the filename. the name of the file is 3.ppt where three is the id parameter in the url. I would like to know if there is a way to set the filename to something a little more descriptive than 3.ppt.
thx,
-C
You could use send_data:
send_data pptdata, :filename => 'your_file_name.ppt',
:disposition => 'inline', :type => "multipart/related"
Another advantage of this is you can use x-sendfile, so that you're mongrel/thin isn't waiting while the client downloads the data.
Another option would be to have a route like:
/elements/3/files/foo.ppt
Then in your show method for the FilesController you can send whatever the id parameter would be.
A possible example:
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
Ok. This is an answer for a very old question, but as of Rails 3.2 the most simple way is to set it like:
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
Source API Doc
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With