#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 путь к контроллеру, который выводит изображение, а не фактический путь к изображению.