Rails paperclip gem - Получить файл из личной папки

Я использую скрепку для загрузки файлов на свой сервер. Если я не укажу путь, скрепка сохранит файл в общую папку, а затем я смогу загрузить его, открыв <%= @user.file.url %> в представлении. Но если я укажу путь к непубличной папке, то получить файл из представления, очевидно, невозможно.

Я хотел бы знать, как загрузить сохраненные файлы в личную папку, из Интернета и из скрипта ruby.


person user1573607    schedule 05.12.2012    source источник
comment
Вы можете сделать перенаправление с вашего веб-сервера или обратного прокси-сервера.   -  person Rodrigo Oliveira    schedule 05.12.2012


Ответы (1)


Первое, что нам нужно сделать, это добавить маршрут в route.rb для доступа к файлам.

Отредактируйте route.rb и добавьте параметр :member жирным шрифтом:

ресурсы :users, :member => { :avatars => :get }

Теперь, чтобы получить, например, аватар для пользователя 7, мы можем создать такой URL-адрес:

 localhost:3000/users/7/avatars

… и запрос будет перенаправлен на действие avatars в контроллере users (множественное число, поскольку у пользователя может быть более одного стиля аватара).

Итак, теперь давайте продолжим и реализуем метод аватаров и добавим код для загрузки файла в клиент. Это можно сделать с помощью ActionController::Streaming::send_file. Это достаточно просто; нам просто нужно передать путь к файлу в send_file, а также тип содержимого MIME, который клиент использует в качестве подсказки для принятия решения о том, как отображать файл, и все! Давайте жестко закодируем эти значения для лучшего понимания (обновите путь здесь для вашей машины):

    class UsersController < ApplicationController
      def avatars
       send_file '/path/to/non-public/system/avatars/7/original/mickey-mouse.jpg',
       :type => 'image/jpeg'
      end
    end

Теперь, если вы наберете localhost:3000/users/7/avatars в своем браузере, вы должны увидеть изображение Микки.

Вместо жесткого кодирования пути в методе аватаров нам, очевидно, нужно иметь возможность обрабатывать запросы на любое вложение файла аватара для любой записи пользователя. Для этого настройте Paperclip и сообщите ему, где файлы теперь хранятся в файловой системе, и какой URL-адрес мы настроили для использования в файле route.rb.

Для этого нам нужно добавить пару параметров к нашему вызову has_attached_file в нашей модели пользователя (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' 

Но теперь мы можем обобщить наш код в UserController для обработки любого пользователя, например:

    def avatars
      user = User.find(params[:id])
      send_file user.avatar.path, :type => user.avatar_content_type
    end         

Теперь мы можем снова протестировать localhost:3000/users/7/avatars, чтобы убедиться, что мы ничего не сломали.

Ваше здоровье!

person My God    schedule 05.12.2012
comment
Этот код использует путь аватара для отправки файла (для загрузки или в собственную вкладку/окно браузера). Но мне интересно, будет ли работать в представлении следующее: `‹%= image_tag @user.avatar.url %›. Видишь, что я имею в виду? - person Giuseppe; 01.09.2014