2009-03-05 6 views
7

J'ai une action de contrôleur qui permet à un utilisateur de télécharger un fichier avec une extension de .ppt. Ce n'est pas vraiment un binaire powerpoint, juste un format xml-ish que powerpoint peut lire. le fichier est téléchargé à partir de l'action show d'un contrôleur appelé ElementsController, mais l'action show n'est pas réellement définie dans le contrôleur, il existe cependant un fichier template dans app/views/elements/show.ppt.builder. Je le Mime :: type enregistré dans config/initializers/mime_types.rb en tant que tel:Définition du nom de fichier pour un fichier téléchargé dans une application rails

Mime::Type.register "multipart/related", :ppt

et les téléchargements de fichiers correctement, et ouvre avec powerpoint sur un système Windows, mais le problème est le nom du fichier. le nom du fichier est 3.ppt où trois est le paramètre id dans l'URL. Je voudrais savoir s'il existe un moyen de définir le nom de fichier à quelque chose d'un peu plus descriptif que 3.ppt.

thx,

C

Répondre

18

Vous pouvez utiliser send_data:

send_data pptdata, :filename => 'your_file_name.ppt', 
    :disposition => 'inline', :type => "multipart/related" 

Un autre avantage est que vous pouvez utiliser x-sendfile, de sorte que vous êtes bâtarde/ISN mince » t attendre pendant que le client télécharge les données.


Une autre option serait d'avoir une route comme:

/elements/3/files/foo.ppt

Ensuite, dans votre méthode show pour le FilesController vous pouvez envoyer quel que soit le paramètre id serait.

+0

le problème avec send_data est que je dois ouvrir la méthode dans le contrôleur et définir respond_to do | format |, ce que j'essaie d'éviter. –

+0

Qu'est-ce qui ne va pas avec respond_to? – jonnii

+0

J'ai mis à jour ma question avec une autre idée. – jonnii

11

Un exemple possible:

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 
+0

Merci, cette réponse m'a aidé à répondre [ma propre question] (http://stackoverflow.com/questions/12902052/rails-3-set-the-filename-in-a-respond-to/12902958). –

3

Ok. Ceci est une réponse à une question très ancienne, mais comme des Rails 3.2 de la façon la plus simple est de le définir comme:

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

Questions connexes