tutorial rails imagenes active ruby-on-rails download paperclip private

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.