Wie zeige ich ein Bild aus einem privaten Ordner in View an?
-
21-12-2019 - |
Frage
Ich brauche einen kurzen Tipp für etwas, das wirklich einfach erscheint.Ich habe einige Bilder in einem privaten Ordner und möchte sie in meiner Ansicht anzeigen.
Die einzige Lösung, die ich gefunden habe, war diese:
def show
send_file 'some/image/url', :disposition => 'inline', :type => 'image/jpg', :x_sendfile => true
end
Das habe ich gelesen :disposition => 'inline'
sollte keinen Bild-Download auslösen und es mir ermöglichen, es in meiner Ansicht anzuzeigen.Das Problem ist, dass ich jedes Mal auslöse show
Aktion wird der Bild-Download automatisch aktiviert und automatisch heruntergeladen.Ansicht für show
Aktion wird nicht angezeigt.
Wie kann ich dieses Bild in meiner Ansicht anzeigen?Danke schön.
Lösung
Die Art und Weise, wie ich es mache, und ich behaupte nicht, dass es perfekt ist, besteht darin, dass ich ein Stammverzeichnis für Bilder und eine Aktion im Controller erstelle, um es zu rendern.
So zum Beispiel in „routes.rb“.
match '/images/:image', to: "your_controller#showpic", via: "get", as: :renderpic
In Ihrem Controller:
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
Und aus Ihrer Sicht
<img src="<%= renderpic_path(your image) %>">
Hier ist ein funktionierendes Beispiel mit weniger Parametern für „send_file“
def showpic
photopath = "images/users/#{params[:image]}.jpg"
send_file "#{photopath}", :disposition => 'inline'
end
Andere Tipps
Ich denke, das Problem ist type
.Aus der Dokumentation:
:type - specifies an HTTP content type
Es sollte also der richtige HTTP-Inhaltstyp sein image/jpeg
anstatt image/jpg
, wie du kannst siehe hier.Versuche es mit:
:type => 'image/jpeg'
Sie können auch alle verfügbaren Codierungstypen auflisten Mime::EXTENSION_LOOKUP
in eine Schienenkonsole.
Beispiel:
Regler
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
Routen
get '/image/:path', to: 'images#show_image', as: :image
Ansichten
image_tag image_path('path_to_image')
Sie müssten dafür sorgen, dass die Ansicht ein image_tag verwendet, um in der Ansicht angezeigt zu werden.
Eine ähnliche Frage wurde hier aufgeworfen: Bilder mit Carrierwave in Rails 3.1 werden in einem privaten Store-Ordner angezeigt