Question

J'ai une action de contrôleur qui permet à un utilisateur de télécharger un fichier avec une extension .ppt. Ce n'est pas vraiment un fichier binaire powerpoint, mais simplement 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 définie dans le contrôleur. Il existe toutefois un fichier modèle pour ce fichier dans app / views / elements / show.ppt.builder. J'ai le Mime :: Type enregistré dans config / initializers / mime_types.rb en tant que tel:

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

et le fichier se télécharge correctement et s'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. J'aimerais savoir s'il existe un moyen de définir un nom de fichier plus descriptif que 3.ppt.

thx,

-C

Était-ce utile?

La solution

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 ne restez pas en attente pendant que le client télécharge les données.

Une autre option serait d’avoir un itinéraire tel que:

/elements/3/files/foo.ppt

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

Autres conseils

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

Ok. C'est une réponse à une question très ancienne, mais à partir de Rails 3.2, le moyen le plus simple consiste à le définir comme suit:

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

Document d'API source

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top