Загрузка / выгрузка файлов Carrierwave и Amazon S3 - PullRequest
11 голосов
/ 04 сентября 2011

У меня есть приложение rails 3 с UploadsUploader и моделью ресурсов, на которой оно смонтировано. Я недавно переключился на использование хранилища s3, и это нарушило мою способность загружать файлы с помощью метода send_to. Я могу разрешить загрузку, используя метод redirect_to, который просто перенаправляет пользователя на аутентифицированный URL-адрес s3. Мне нужно аутентифицировать загрузку файлов, и я хочу, чтобы URL был http://mydomainname.com/the_file_path или http://mydomainname.com/controller_action_name/id_of_resource, поэтому я предполагаю, что мне нужно использовать send_to, но есть ли способ сделать это с помощью метода redirect_to? Мой текущий код следует. Resources_controller.rb

def download
  resource = Resource.find(params[:id])
    if resource.shared_items.find_by_shared_with_id(current_user) or resource.user_id == current_user.id
        filename = resource.upload_identifier
        send_file "#{Rails.root}/my_bucket_name_here/uploads/#{filename}"
    else
        flash[:notice] = "You don't have permission to access this file."
        redirect_to resources_path
    end
end

инициализатор carrierwave.rb:

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',       # required
    :aws_access_key_id      => 'xxxx',       # copied off the aws site
    :aws_secret_access_key  => 'xxxx',       # 
  }

  config.fog_directory  = 'my_bucket_name_here'                     # required
  config.fog_host       = 'https://localhost:3000'            # optional, defaults to nil
  config.fog_public     = false                                   # optional, defaults to true
  config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}  # optional, defaults to {}
end

upload_uploader.rb

class UploadUploader < CarrierWave::Uploader::Base
  storage :fog

  def store_dir
    "uploads"
  end
end

Все это выдает ошибку:

Не удается прочитать файл /home/tom/Documents/ruby/rails/circlshare/My_bucket_name_here/uploads/Picture0024.jpg

Я попытался прочитать о carrierwave, fog, send_to и обо всем этом, но все, что я пробовал, пока не принесло плодов. Загрузка работает нормально, и я вижу файлы в корзине s3. Использование re_direct было бы здорово, так как файл не прошел бы через мой сервер. Любая помощь приветствуется. Благодаря.

1 Ответ

6 голосов
/ 04 сентября 2011

Похоже, вы хотите загрузить на S3, но не общедоступные URL-адреса. Вместо загрузки файла с S3 и использования send_file, вы можете перенаправить пользователя на URL-адрес с аутентификацией S3. Срок действия этого URL истечет, и он будет действителен только в течение некоторого времени (для загрузки пользователем).

Проверить эту тему: http://groups.google.com/group/carrierwave/browse_thread/thread/2f727c77864ac923

Поскольку вы уже устанавливаете fog_public в false, вы получаете аутентифицированный (то есть подписанный) URL при вызове resource.upload_url

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...