Comment afficher l’image d’un dossier privé dans View ?
-
21-12-2019 - |
Question
J'ai besoin d'un petit conseil sur quelque chose qui semble vraiment simple.J'ai quelques images dans un dossier privé et j'aimerais les afficher dans ma vue.
La seule solution que j'ai trouvée était la suivante :
def show
send_file 'some/image/url', :disposition => 'inline', :type => 'image/jpg', :x_sendfile => true
end
j'ai lu ça :disposition => 'inline'
ne devrait pas déclencher le téléchargement de l'image et me permettre de l'afficher dans ma vue.Le problème c'est qu'à chaque fois que je déclenche show
action, le téléchargement de l’image est automatiquement activé et il est automatiquement téléchargé.Afficher pour show
l’action n’est pas affichée.
Comment puis-je afficher cette image dans ma vue ?Merci.
La solution
La façon dont je le fais, et je ne dis pas que c'est parfaitement conforme aux règles, est de créer une racine pour les images et une action dans le contrôleur pour la restituer.
Ainsi, par exemple, dans routes.rb
match '/images/:image', to: "your_controller#showpic", via: "get", as: :renderpic
Dans votre contrôleur :
def showpic
send_file "some/path/#{params[:image]}.jpg", :disposition => 'inline',
:type => 'image/jpg', :x_sendfile => true # .jpg will pass as format
end
def show
end
Et à votre avis
<img src="<%= renderpic_path(your image) %>">
Voici un exemple fonctionnel, avec moins de paramètres sur "send_file"
def showpic
photopath = "images/users/#{params[:image]}.jpg"
send_file "#{photopath}", :disposition => 'inline'
end
Autres conseils
Je pense que le problème est type
.À partir de la documentation :
:type - specifies an HTTP content type
Le type de contenu HTTP approprié doit donc être image/jpeg
au lieu de image/jpg
, comme tu peux vois ici.Essayez avec :
:type => 'image/jpeg'
Vous pouvez également lister tous les types de codage disponibles Mime::EXTENSION_LOOKUP
dans une console de rails.
Exemple:
Manette
class ImagesController < ApplicationController
def show_image
image_path = File.join(Rails.root, params[:path]) # or similar
send_file image_path, disposition: 'inline', type: 'image/jpeg', x_sendfile: true
end
end
Itinéraires
get '/image/:path', to: 'images#show_image', as: :image
Vues
image_tag image_path('path_to_image')
Vous devrez faire en sorte que la vue utilise un image_tag pour s'afficher sur la vue.
Une question similaire a été soulevée ici : Affichage des images avec Carrierwave dans Rails 3.1 dans un dossier de magasin privé