¿Cómo mostrar la imagen de la carpeta privada dentro de Ver?
-
21-12-2019 - |
Pregunta
Necesito un consejo rápido sobre algo que parece realmente simple.Tengo algunas imágenes dentro de una carpeta privada y me gustaría mostrarlas dentro de mi Vista.
La única solución que encontré fue esta:
def show
send_file 'some/image/url', :disposition => 'inline', :type => 'image/jpg', :x_sendfile => true
end
He leído eso :disposition => 'inline'
no debería activar la descarga de la imagen y permitirme mostrarla dentro de mi Vista.El problema es que cada vez que disparo show
acción, la descarga de imágenes se activa automáticamente y se descarga automáticamente.Ver para show
La acción no se muestra.
¿Cómo puedo mostrar esa imagen dentro de mi Vista?Gracias.
Solución
La forma en que lo hago, y no estoy diciendo que sea perfectamente perfectamente en el libro, es que haga una raíz de imágenes y una acción en el controlador para hacerlo.
Entonces, por ejemplo, en rutas.rb
match '/images/:image', to: "your_controller#showpic", via: "get", as: :renderpic
en su 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
y en su vista
<img src="<%= renderpic_path(your image) %>">
Aquí hay un ejemplo de trabajo, con menos parámetros en "send_file"
def showpic
photopath = "images/users/#{params[:image]}.jpg"
send_file "#{photopath}", :disposition => 'inline'
end
Otros consejos
Creo que el problema es type
.De la documentación:
:type - specifies an HTTP content type
Por lo tanto, el tipo de contenido HTTP adecuado debe ser image/jpeg
en lugar de image/jpg
, como puede ver aquí .Prueba con:
:type => 'image/jpeg'
También puede enumerar todos los tipos disponibles que codifican Mime::EXTENSION_LOOKUP
en una consola de rieles.
Ejemplo:
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
rutas
get '/image/:path', to: 'images#show_image', as: :image
vistas
image_tag image_path('path_to_image')
Debería tener la vista Use una imagen_tag para mostrar en la vista.
Se planteó una pregunta similar aquí: Mostrando imágenes con CarrierWave en Rails 3.1 en una carpeta de tienda privada