ruby-on-rails - imagenes - storage rails
Rieles clip gema-Obtener el archivo de la carpeta privada (1)
Lo primero que debemos hacer es agregar una ruta a routes.rb para acceder a los archivos.
Edite routes.rb y agregue el parámetro: member en negrita:
recursos: users ,: member => {: avatars =>: get}
Ahora, para obtener el avatar para el usuario 7, por ejemplo, podemos emitir una URL como esta:
localhost:3000/users/7/avatars
... y la solicitud se enrutará a la acción avatars
en el controlador de los users
(plural ya que un usuario puede tener más de un estilo de avatar).
Así que ahora vayamos directo e implementemos el método de avatares y agreguemos algún código para descargar un archivo al cliente. La forma de hacerlo es usar ActionController :: Streaming :: send_file . Es bastante simple; solo tenemos que pasar la ruta del archivo a send_file, así como el tipo de contenido MIME que el cliente usa como pista para decidir cómo mostrar el archivo, ¡y eso es todo! Vamos a codificar estos valores para una mejor comprensión (actualice la ruta aquí para su máquina):
class UsersController < ApplicationController
def avatars
send_file ''/path/to/non-public/system/avatars/7/original/mickey-mouse.jpg'',
:type => ''image/jpeg''
end
end
Ahora, si escribe localhost:3000/users/7/avatars
en su navegador, debería ver la imagen de mickey.
En lugar de codificar el camino en el método de avatares, obviamente necesitamos poder gestionar las solicitudes de archivos adjuntos de avatar para cualquier registro de usuario. Para hacer esto, configure Paperclip y dígale dónde están almacenados los archivos en el sistema de archivos, y en qué URL hemos configurado nuestro archivo routes.rb para usar.
Para hacer esto, necesitamos agregar un par de parámetros a nuestra llamada a has_attached_file en nuestro modelo de Usuario (user.rb),
has_attached_file :avatar,
:styles => { :thumb => "75x75>", :small => "150x150>" },
:path =>
'':rails_root/non-public/system/:attachment/:id/:style/:basename.:extension'',
:url => ''/:class/:id/:attachment''
Pero ahora podemos generalizar nuestro código en UserController para manejar cualquier usuario, como este:
def avatars
user = User.find(params[:id])
send_file user.avatar.path, :type => user.avatar_content_type
end
Ahora podemos probar localhost:3000/users/7/avatars
nuevamente para asegurarnos de no haber roto nada.
¡Aclamaciones!
Estoy usando paperclip para subir archivos a mi servidor. Si no especifico la ruta, paperclip guarda el archivo en una carpeta pública, y luego puedo descargarlo accediendo a <%= @user.file.url %>
en la vista. Pero si especifico la ruta a una carpeta no pública, obviamente no es posible obtener el archivo de la vista.
Me gustaría saber cómo descargar los archivos guardados en una carpeta privada, desde la web y desde un script de ruby.