Como exibir a imagem da pasta privada dentro do View?
-
21-12-2019 - |
Pergunta
Preciso de uma dica rápida sobre algo que parece muito simples.Tenho algumas fotos dentro de uma pasta privada e gostaria de exibi-las dentro do meu View.
A única solução que encontrei foi esta:
def show
send_file 'some/image/url', :disposition => 'inline', :type => 'image/jpg', :x_sendfile => true
end
eu li isso :disposition => 'inline'
não deve acionar o download da imagem e permitir que eu a exiba dentro do meu View.O problema é que cada vez que eu aciono show
ação, o download da imagem é ativado automaticamente e é baixado automaticamente.Ver para show
a ação não é exibida.
Como posso exibir essa imagem dentro da minha View?Obrigado.
Solução
A maneira como faço isso, e não estou dizendo que seja perfeitamente conforme as regras, é criar uma raiz para as imagens e uma ação no controlador para renderizá-las.
Então, por exemplo, em rotas.rb
match '/images/:image', to: "your_controller#showpic", via: "get", as: :renderpic
No seu controlador:
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 na sua opinião
<img src="<%= renderpic_path(your image) %>">
Aqui está um exemplo prático, com menos parâmetros em "send_file"
def showpic
photopath = "images/users/#{params[:image]}.jpg"
send_file "#{photopath}", :disposition => 'inline'
end
Outras dicas
Eu acho que o problema é type
.Da documentação:
:type - specifies an HTTP content type
Portanto, o tipo de conteúdo HTTP adequado deve ser image/jpeg
em vez de image/jpg
, como você puder Veja aqui.Experimente com:
:type => 'image/jpeg'
Você também pode listar todos os tipos de codificação disponíveis Mime::EXTENSION_LOOKUP
em um console Rails.
Exemplo:
Controlador
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
Rotas
get '/image/:path', to: 'images#show_image', as: :image
Visualizações
image_tag image_path('path_to_image')
Você precisaria que a visualização usasse um image_tag para exibir na visualização.
Questão semelhante foi levantada aqui: Mostrando imagens com carrierwave no Rails 3.1 em uma pasta de armazenamento particular