Защита загруженных файлов Carrierwave

#ruby-on-rails #file-upload #carrierwave

#ruby-on-rails #загрузка файла #carrierwave

Вопрос:

хочу убедиться, что ТОЛЬКО пользователи, вошедшие в систему, могут просматривать / загружать файлы, загруженные с carrierwave.

Как это делается?

Переместил каталог хранилища из общедоступного в RAILS_ROOT, создал маршрут для показа и загрузки.

Проблема в том, что если это изображение, <%= image_tag(photo.image_url) %> я получаю полный путь / Users/myname /projects/appname /files/image / id / image.png, так что это не отображается.

Также было бы неплохо, если бы view отображал не мой абсолютный путь, а только относительный путь с сайта.

Ответ №1:

На самом деле это действительно легко сделать. Вот блог, в котором рассказывается о sendfile и x-sendfile. Это должно направить вас в правильном направлении.

http://www.therailsway.com/2009/2/22/file-downloads-done-right

Вот документы rails для этого.

http://api.rubyonrails.org/classes/ActionController/Streaming.html#method-i-send_file

Поскольку все это обрабатывается на уровне контроллера, просто убедитесь, что у вас есть before_filter, который проверяет, авторизован ли пользователь, затем используйте метод send_file в вашем действии контроллера.

Комментарии:

1. Я видел эту статью и требует, чтобы я переместил store_dir из общедоступного, но я думаю, что я делаю что-то неправильно. store_dir является «/#{Rails.root.to_s}/files/#{model.class.to_s.underscore}/#{mounted_as}/#{model.customer_id}/#{model.id}». Продолжайте получать ActionController::RoutingError (маршрут не совпадает » /Users/…/42/142/thumb_9-cars.jpg «)

2. Да, у вас не будет маршрута к файлу, используя этот путь в веб-приложении, вот почему вы используете send_file… таким образом, вы можете указать ему обычный путь к файловой системе. Если carrierwave хранит файл в вашей файловой системе, а image_url является правильным путем. Все должно просто работать. Помните, что вы собираетесь указывать своим тегом image путь к контроллеру, который выводит изображение, а не фактический путь к изображению.