définition du nom de fichier d'un fichier téléchargé dans une application rails
-
03-07-2019 - |
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
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