Rails paperclip gem - Вземете файл от лична папка

Използвам кламер за качване на файлове на моя сървър. Ако не посоча пътя, кламер записва файла в публична папка и след това мога да го изтегля чрез достъп до <%= @user.file.url %> в изгледа. Но ако посоча пътя към папка, която не е публична, очевидно не е възможно да получа файла от изгледа.

Бих искал да знам някакъв начин за изтегляне на запазените файлове в лична папка, от мрежата и от ruby ​​скрипт.


person user1573607    schedule 05.12.2012    source източник
comment
Можете да направите пренасочване от вашия уеб сървър или обратен прокси сървър   -  person Rodrigo Oliveira    schedule 05.12.2012


Отговори (1)


Първото нещо, което трябва да направим, е да добавим маршрут към routes.rb за достъп до файловете.

Редактирайте routes.rb и добавете параметъра :member с удебелен шрифт:

ресурси :потребители, :член => { :аватари => :получи }

Сега, за да получим аватара за потребител 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 адрес сме конфигурирали да използва нашия файл routes.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