Загрузка/выгрузка файлов Carrierwave и Amazon S3

У меня есть приложение 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

Инициализатор несущей волны.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

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


person technix    schedule 04.09.2011    source источник


Ответы (1)


Похоже, вы хотите загрузить на 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

person Jesse Wolgamott    schedule 04.09.2011
comment
Я получаю аутентифицированный URL-адрес, и метод redirect_to работает. Предположительно, мне придется сказать своим пользователям «Щелкните правой кнопкой мыши, чтобы сохранить», иначе их браузер может открывать изображения в браузере, показывая URL-адрес Amazon, что, хотя технически не является проблемой, просто выглядит немного любительским. Или есть способ скрыть URL-адрес от пользователя? Спасибо за помощь. - person technix; 04.09.2011
comment
@technix - это именно то, что 37signals делает с загрузкой файлов basecamp. Я бы не стал заморачиваться с сохранением по щелчку правой кнопкой мыши, но это на ваше усмотрение. - person Jesse Wolgamott; 05.09.2011