Comment faire pour télécharger un fichier à partir de l'application rails
Je n'arrive pas à trouver un moyen simple et claire réponse à ce problème n'importe où! Tout semble obsolète ou incomplète!
Je veux juste que l'utilisateur puisse cliquer sur un lien ou un bouton et de télécharger un fichier (qui est quelque part dans le dossier public)
J'ai essayé ceci:
#view
<%= link_to "Raw blast output" ,:action => :download, :file_name => "public/data/02_blastout/#{@bl_file}" %>
#controller
def download
send_file "#{RAILS_ROOT}/#{params[:file_name]}"
end
mais j'obtiens cette erreur:
No route matches {:action=>"download", :file_name=>"public/data/02_blastout/input0.fa_x_Glyma1aaunq.bl", :controller=>"cvits"}
Merci pour l'aide!!
- peut-être que c' ap.rubyonrails.org/classes/ActionController/Streaming.html ?
- Cela semble terriblement dangereux façon de gérer cela, compte tenu en particulier, vous pouvez tout simplement un lien directement vers le fichier.
- utilisez quoi? Je suis déjà à l'aide de la send_file méthode.
- Quelqu'un pourrait modifier votre lien comme ceci:
?file_name=config/database.yml
- Je serais plus qu'heureux d'entendre parler de la "bonne voie" pour un utilisateur afin d'obtenir un fichier!!! Ouvert à toutes suggestions!
- Eh bien, si le fichier est dans le public, que vous pouvez simplement leur donner un lien vers elle. Rien en public est disponible sous la racine du site. Quelque chose comme
/public/thing.png
est disponible en/thing.png
. - send_file ne devrait jamais être donné à un chemin d'accès défini par un paramètre, cela ouvre un trou de sécurité majeur que les utilisateurs malveillants d'exploiter.
- Merci c'est exactement ce que je veux! Désolé, encore assez nouveau pour le développement web et rails en particulier. 🙂 stackoverflow a un meilleur temps de réponse que n'importe quel autre forum!
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser
send_file
avec un paramètre défini par l'utilisateur. Cela ouvre une énorme faille de sécurité permettant à un utilisateur d'accéder à un fichier lisible par votre application (à savoir, l'ensemble de votre application, mais aussi éventuellement d'autres fichiers sur le système de fichiers).Plutôt, si le fichier est dans le secteur public, lien vers le fichier lui-même. Dans votre cas:
Pas besoin d'un contrôleur spécial de l'action.