Come visualizzare l'immagine dalla cartella privata all'interno di View?
-
21-12-2019 - |
Domanda
Ho bisogno di un consiglio veloce su qualcosa che sembra davvero semplice.Ho alcune immagini nella cartella privata e vorrei visualizzarle nella mia vista.
L'unica soluzione che ho trovato è stata questa:
def show
send_file 'some/image/url', :disposition => 'inline', :type => 'image/jpg', :x_sendfile => true
end
L'ho letto :disposition => 'inline'
non dovrebbe attivare il download dell'immagine e consentirmi di visualizzarla all'interno della mia vista.Il problema è che ogni volta che mi innesco show
azione, il download dell'immagine viene attivato automaticamente e viene scaricato automaticamente.Visualizza per show
l'azione non viene visualizzata.
Come posso visualizzare quell'immagine all'interno della mia vista?Grazie.
Soluzione
Il modo in cui lo faccio, e non sto dicendo che è perfettamente dal libro, è che faccio una radice per le immagini e un'azione nel controller per renderla.
Quindi, ad esempio, in routine.rb
match '/images/:image', to: "your_controller#showpic", via: "get", as: :renderpic
.
Nel tuo 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
.
e in vostra vista
<img src="<%= renderpic_path(your image) %>">
.
Ecco un esempio di funzionamento, con meno parametri su "SEND_FILE"
def showpic
photopath = "images/users/#{params[:image]}.jpg"
send_file "#{photopath}", :disposition => 'inline'
end
. Altri suggerimenti
Penso che il problema sia type
.Dalla documentazione:
:type - specifies an HTTP content type
Quindi dovrebbe essere il tipo di contenuto HTTP corretto image/jpeg
invece di image/jpg
, come puoi Vedere qui.Prova con:
:type => 'image/jpeg'
È inoltre possibile elencare tutti i tipi di codifica disponibili Mime::EXTENSION_LOOKUP
in una console con binari.
Esempio:
Controllore
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
Itinerari
get '/image/:path', to: 'images#show_image', as: :image
Visualizzazioni
image_tag image_path('path_to_image')
È necessario disporre della vista utilizzare un'immagine_tag da visualizzare sulla vista.
Domanda simile è stata sollevata qui: Mostrando immagini con Carrierwave in Rails 3.1 in una cartella del negozio privato